Flutter StatefulWidget 生命周期

一般提到 flutter 的生命周期吁恍,有 App 的生命周期和StatefulWidget 生命周期兩個概念颇象。本文只討論 StatefulWidget 的生命周期。

StatefulWidget 生命周期指的是 StatefulWidget 從創(chuàng)建到銷毀的過程敛纲,實(shí)際上體現(xiàn)在 State 類的的方法的調(diào)用順序和調(diào)用時機(jī)掠兄。

1.createState

createStateStatefulWidget 創(chuàng)建 State 的方法像云。從 State 的角度來說锌雀,這個方法是個構(gòu)造方法,只會調(diào)用一次迅诬。
但是從 StatefulWidget 角度來說腋逆,這個方法會在 StatefulWidget 的生命周期里調(diào)用多次,如果 StatefulWidget 在樹的不同位置侈贷,framework 會調(diào)用 createState 多次來創(chuàng)建不同的 State惩歉。如果StatefulWidget從樹中移除再插入樹的話,framework 會調(diào)用 createState 來刷新 State俏蛮。

調(diào)用時機(jī):當(dāng) StatefulWidget 插入樹中調(diào)用撑蚌。

  /// The framework can call this method multiple times over the lifetime of
  /// a [StatefulWidget]. For example, if the widget is inserted into the tree
  /// in multiple locations, the framework will create a separate [State] object
  /// for each location. Similarly, if the widget is removed from the tree and
  /// later inserted into the tree again, the framework will call [createState]
  /// again to create a fresh [State] object, simplifying the lifecycle of
  /// [State] objects.

2.initState

initState 是在 createState 之后調(diào)用,只會調(diào)用一次搏屑,一般只在這里執(zhí)行只需要調(diào)用一次的初始化方法争涌,例如訂閱者。

///  * In [initState], subscribe to the object.
  ///  * In [didUpdateWidget] unsubscribe from the old object and subscribe
  ///    to the new one if the updated widget configuration requires
  ///    replacing the object.
  ///  * In [dispose], unsubscribe from the object.

3. didChangeDependencies

didChangeDependencies 在 initState 之后調(diào)用辣恋,如果調(diào)用了 [BuildContext.dependOnInheritedWidgetOfExactType]方法亮垫,InheritedWidget 在數(shù)據(jù)改變時也會調(diào)用 didChangeDependencies 方法。

4.build

build() 主要是用于構(gòu)建 widget 子樹的伟骨,會在如下場景被調(diào)用:

在調(diào)用initState()之后包警。
在調(diào)用didUpdateWidget()之后。
在調(diào)用setState()之后底靠。
在調(diào)用didChangeDependencies()之后害晦。
在State對象從樹中一個位置移除后,又重新插入到樹的其他位置之后。

  /// The framework calls this method in a number of different situations. For
  /// example:
  ///
  ///  * After calling [initState].
  ///  * After calling [didUpdateWidget].
  ///  * After receiving a call to [setState].
  ///  * After a dependency of this [State] object changes (e.g., an
  ///    [InheritedWidget] referenced by the previous [build] changes).
  ///  * After calling [deactivate] and then reinserting the [State] object into
  ///    the tree at another location.

5.didUpdateWidget

當(dāng) widget 需要更新的時候會調(diào)用次方法暑中,將 widget 屬性和新的 widget 綁定壹瘟,在這里對 widget 屬性的更新做處理,此方法執(zhí)行后會調(diào)用build方法鳄逾,所以無需調(diào)用 setState稻轨。

6.reassemble

reassemble 只在熱重載(hot reload)時會被調(diào)用,此回調(diào)在Release模式下永遠(yuǎn)不會被調(diào)用雕凹∨咕悖可以調(diào)試的時候?qū)?shù)據(jù)進(jìn)行重新初始化的操作。

7.deactivate

當(dāng) State 從樹中移除的時候調(diào)用枚抵。

8.activate

activate 是在 deactivate 之后重新插入樹時調(diào)用线欲。一般發(fā)生在使用 GlobalKey 從樹的某一個位置移動到另一個位置。在調(diào)用完activate后會自動調(diào) build 方法重建汽摹。

9.dispose

dispose當(dāng) State 永久的從樹中移除的時候會調(diào)用李丰。mounted 會變?yōu)閒alse,無法調(diào)用setState,在此方法需要釋放掉持有的資源逼泣。

StatefulWidget 生命周期.png
參考資料

《Flutter實(shí)戰(zhàn)·第二版》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末趴泌,一起剝皮案震驚了整個濱河市舟舒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嗜憔,老刑警劉巖秃励,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異吉捶,居然都是意外死亡莺治,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門帚稠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谣旁,“玉大人,你說我怎么就攤上這事滋早¢螅” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵杆麸,是天一觀的道長搁进。 經(jīng)常有香客問我,道長昔头,這世上最難降的妖魔是什么饼问? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮揭斧,結(jié)果婚禮上莱革,老公的妹妹穿的比我還像新娘。我一直安慰自己讹开,他們只是感情好盅视,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著旦万,像睡著了一般闹击。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上成艘,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天赏半,我揣著相機(jī)與錄音,去河邊找鬼淆两。 笑死断箫,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的琼腔。 我是一名探鬼主播瑰枫,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼丹莲!你這毒婦竟也來了光坝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤甥材,失蹤者是張志新(化名)和其女友劉穎盯另,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洲赵,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸳惯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了叠萍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芝发。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖苛谷,靈堂內(nèi)的尸體忽然破棺而出辅鲸,到底是詐尸還是另有隱情,我是刑警寧澤腹殿,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布独悴,位于F島的核電站,受9級特大地震影響锣尉,放射性物質(zhì)發(fā)生泄漏刻炒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一自沧、第九天 我趴在偏房一處隱蔽的房頂上張望坟奥。 院中可真熱鬧,春花似錦拇厢、人聲如沸筏勒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽管行。三九已至,卻和暖如春邪媳,著一層夾襖步出監(jiān)牢的瞬間捐顷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工雨效, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留迅涮,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓徽龟,卻偏偏與公主長得像叮姑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

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