Flutter 生命周期

在之前的一篇文章 React 生命周期 是我在學(xué)習(xí) React 之初總結(jié)的夸盟,那么現(xiàn)如今正處于學(xué)習(xí) Flutter 之初显歧,遂寫了這篇 Flutter 生命周期。

談起 React 生命周期都會默認(rèn)是 Component 生命周期何鸡,那么 Flutter 中的生命周期是什么呢香罐?

Flutter 一切皆 Widget,因此自然是 Widget 的生命周期铭拧,并是通過 State來體現(xiàn)赃蛛。而 App 則是一個特殊的 Widget,除了需要處理視圖顯示的各個階段(即視圖的生命周期)之外搀菩,還需要應(yīng)對應(yīng)用從啟動到退出所經(jīng)歷的各個狀態(tài)(App 的生命周期)

State 生命周期

State 生命周期

如上圖呕臂,State 生命周期可以分為三個階段:創(chuàng)建,更新肪跋,銷毀歧蒋。

創(chuàng)建

依次執(zhí)行: 構(gòu)造方法 -> initState -> didChangeDependencies -> build,隨后完成頁面的渲染

  • 構(gòu)造方法:State 生命周期的起點,F(xiàn)lutter 會通過調(diào)用 StatefulWidget.createState() 來創(chuàng)建一個 State谜洽÷苡常可以通過構(gòu)造方法來接收父 Widget 傳遞的初始化 UI 配置數(shù)據(jù)

  • initState:在 State 對象被插入視圖樹的時候調(diào)用。在 State 生命周期中只會被調(diào)用一次

  • didChangeDependencies:用來處理 State 對象依賴關(guān)系變化阐虚,會在 initState() 調(diào)用結(jié)束后被調(diào)用

  • build:構(gòu)建視圖锌俱。經(jīng)過以上步驟,F(xiàn)ramework 認(rèn)為 State已經(jīng)準(zhǔn)備好了敌呈,于是調(diào)用 build。需要根據(jù)父 Widget 傳遞的初始化數(shù)據(jù)造寝,以及 State 當(dāng)前狀態(tài)磕洪,創(chuàng)建一個 Widget 并返回

更新
  • setState:當(dāng)狀態(tài)數(shù)據(jù)發(fā)生變化時,調(diào)用該方法告訴 Flutter 數(shù)據(jù)變了

  • didChangeDependencies:State 對象的依賴關(guān)系發(fā)生變化后诫龙,調(diào)用該方法析显,然后出發(fā)組件構(gòu)建。例如:系統(tǒng)語言或主題變更

  • didUpdateWidget:當(dāng) Widget 的配置發(fā)生變化签赃。例如:父 Widget 的狀態(tài)發(fā)生變化谷异,熱重載時

一旦??這三個方法被調(diào)用,F(xiàn)lutter 就會銷毀老 Widget锦聊,并調(diào)用 build() 重建 Widget

銷毀

組件銷毀相對簡單歹嘹,比如組件被移除,或是頁面銷毀的時候孔庭,系統(tǒng)會調(diào)用 deactivate() 和 dispose() 這兩個方法

具體調(diào)用機(jī)制:

  • 當(dāng)組件的可見狀態(tài)發(fā)生變化時尺上,deactive 會被調(diào)用,State 會被暫時從視圖樹中移除圆到。頁面切換時怎抛,State 在視圖樹中的位置發(fā)生了變化,需要先暫時移除后再重新添加芽淡,重新觸發(fā)組件重構(gòu)马绝,deactive 也會被調(diào)用

  • State 被永久從視圖樹中移除時,dispose 會被調(diào)用挣菲。此時富稻,組件就要被銷毀,所以可以進(jìn)行最終的資源釋放己单、移除監(jiān)聽事件唉窃,等等

State生命周期方法對比

方法名 功能 調(diào)用時機(jī) 調(diào)用次數(shù)
構(gòu)造方法 接收父 Widget 傳遞的初始UI數(shù)據(jù) 創(chuàng)建 State 時 1
initState 與渲染相關(guān)的初始化工作 在State被插入視圖樹時 1
didChangeDependencies 處理State對象依賴關(guān)系變化 initState 后及State對象依賴關(guān)系變化時 >=1
build 構(gòu)建視圖 State準(zhǔn)備好數(shù)據(jù)需要渲染時 >=1
setState 觸發(fā)視圖重建 需要刷新UI時 >=1
didUpdateWidget 處理Widget的配置變化 父 Widget setState 觸發(fā)子Widget重建 >=1
deactivate 組件被移除 組件不可見 >=1
dispose 組件被銷毀 組件永久被移除 1

App 生命周期

App 的生命周期定義的是 App 從移動到退出的全過程

生命周期回調(diào)

didChangeAppLifecycleState 回調(diào)函數(shù)中,有一個參數(shù)類型為 AppLifecycleSate 的枚舉類纹笼,該類封裝了 App 生命周期狀態(tài)纹份。常用狀態(tài):resumedinactivepaused

  • resumed:可見的蔓涧,響應(yīng)用戶輸入
  • inactive:處在不活動狀態(tài)件已,無法處理用戶響應(yīng)
  • paused:不可見并不能響應(yīng)用戶輸入,但在后臺繼續(xù)活動中

App 切換前后臺時狀態(tài)變化:

  • 從后臺切入前臺:AppLifecycleState.paused -> AppLifecycleState.inactive -> AppLifecycleState.resumed

  • 從前臺切入后臺:AppLifecycleState.resumed -> AppLifecycleState.inactive -> AppLifecycleState.paused

App 切換前后臺狀態(tài)變化
幀繪制回調(diào)

除了需要監(jiān)聽 App 的生命周期回調(diào)做相應(yīng)處理之外元暴,還需要在組件渲染之后做一些與顯示安全相關(guān)的操作

ios 中可以通過 dispatch_async((dispatch_get_main_queue), ^{...}) 讓操作在下一個 RunLoop 執(zhí)行篷扩;Android 可以通過 View.post() 插入消息隊列,來保證在組件渲染后進(jìn)行相關(guān)操作

Flutter 中茉盏,WidgetsBinding 提供了單次 Frame 繪制回調(diào)鉴未,以及實時 Frame 繪制回調(diào)兩種機(jī)制

  • 單次 Frame 繪制回調(diào),通過 addPostFrameCallback 實現(xiàn)鸠姨。會在當(dāng)前 Frame 繪制完成后進(jìn)行回調(diào)铜秆,并且只會回調(diào)一次,如果要再次監(jiān)聽需再設(shè)置
WidgetsBinding.instance.addPostFrameCallback((_){
    print("單次Frame繪制回調(diào)"); // 只回調(diào)一次
});
  • 實時 Frame 繪制回調(diào)讶迁,通過 addPersistentFrameCallback 實現(xiàn)连茧。在每次繪制 Frame 結(jié)束后進(jìn)行回調(diào)

WidgetsBinding.instance.addPersistentFrameCallback((_){
  print("實時Frame繪制回調(diào)");//每幀都回調(diào)
});
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市巍糯,隨后出現(xiàn)的幾起案子啸驯,更是在濱河造成了極大的恐慌,老刑警劉巖祟峦,帶你破解...
    沈念sama閱讀 212,185評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件罚斗,死亡現(xiàn)場離奇詭異,居然都是意外死亡搀愧,警方通過查閱死者的電腦和手機(jī)惰聂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,445評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咱筛,“玉大人搓幌,你說我怎么就攤上這事⊙嘎幔” “怎么了溉愁?”我有些...
    開封第一講書人閱讀 157,684評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長饲趋。 經(jīng)常有香客問我拐揭,道長,這世上最難降的妖魔是什么奕塑? 我笑而不...
    開封第一講書人閱讀 56,564評論 1 284
  • 正文 為了忘掉前任堂污,我火速辦了婚禮,結(jié)果婚禮上龄砰,老公的妹妹穿的比我還像新娘盟猖。我一直安慰自己讨衣,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,681評論 6 386
  • 文/花漫 我一把揭開白布式镐。 她就那樣靜靜地躺著反镇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪娘汞。 梳的紋絲不亂的頭發(fā)上歹茶,一...
    開封第一講書人閱讀 49,874評論 1 290
  • 那天,我揣著相機(jī)與錄音你弦,去河邊找鬼惊豺。 笑死,一個胖子當(dāng)著我的面吹牛禽作,可吹牛的內(nèi)容都是我干的扮叨。 我是一名探鬼主播,決...
    沈念sama閱讀 39,025評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼领迈,長吁一口氣:“原來是場噩夢啊……” “哼邻梆!你這毒婦竟也來了双谆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,761評論 0 268
  • 序言:老撾萬榮一對情侶失蹤拟糕,失蹤者是張志新(化名)和其女友劉穎累提,沒想到半個月后尘喝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,217評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡斋陪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,545評論 2 327
  • 正文 我和宋清朗相戀三年朽褪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片无虚。...
    茶點故事閱讀 38,694評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡缔赠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出友题,到底是詐尸還是另有隱情嗤堰,我是刑警寧澤,帶...
    沈念sama閱讀 34,351評論 4 332
  • 正文 年R本政府宣布度宦,位于F島的核電站踢匣,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏戈抄。R本人自食惡果不足惜离唬,卻給世界環(huán)境...
    茶點故事閱讀 39,988評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望划鸽。 院中可真熱鬧输莺,春花似錦戚哎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,778評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至尸折,卻和暖如春啰脚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背实夹。 一陣腳步聲響...
    開封第一講書人閱讀 32,007評論 1 266
  • 我被黑心中介騙來泰國打工橄浓, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人亮航。 一個月前我還...
    沈念sama閱讀 46,427評論 2 360
  • 正文 我出身青樓荸实,卻偏偏與公主長得像,于是被迫代替她去往敵國和親缴淋。 傳聞我的和親對象是個殘疾皇子准给,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,580評論 2 349

推薦閱讀更多精彩內(nèi)容