StatefulWidget State生命周期

initState():當(dāng)Widget第一次插入到Widget樹中時(shí)被調(diào)用冶共。對于每一個(gè)State對象,F(xiàn)lutter framework只會調(diào)用一次該方法怜俐。所以這個(gè)回調(diào)適合做一些變量的初始化翠胰,訂閱子樹的事件通知等韧拒。不能在該回調(diào)中調(diào)用BuildContext.dependOnInheritedWidgetOfExactType方法(該方法用于獲取在Widget樹上離當(dāng)前Widget最近的一個(gè)父級InheritedWidget),原因在于初始化完成之后,InheritedWidget也可能會發(fā)生變化贞谓,所以此時(shí)獲取就不一定正確限佩。正確的時(shí)間是在build() 或者 didChangeDependences() 方法中獲取。

didChangeDependences(): 當(dāng)State對象的依賴發(fā)生變化時(shí)會調(diào)用該方法裸弦。

build(): 構(gòu)建Widget子樹時(shí)會調(diào)用祟同。

1)在調(diào)用initState() 之后。

2)在調(diào)用didUpdateWidget()之后理疙。

3)在調(diào)用setState()之后晕城。

4)在調(diào)用didChangeDependences()之后。

5)在State對象從樹中的一個(gè)位置移除移除后窖贤,又重新插入到樹的其他位置之后砖顷。

reassemble():此回調(diào)專門為開發(fā)調(diào)試提供,在熱重載會被調(diào)用赃梧,在Release模式下不會調(diào)用滤蝠。

didUpdateWidget(): 此回調(diào)在Widget重新創(chuàng)建時(shí)調(diào)用。Flutter framework會調(diào)用Widget.canUpdate() 來檢測Widget樹中同一位置的新舊節(jié)點(diǎn)授嘀,然后決定是否需要更新物咳,如果Widget.canUpdate()返回True,則調(diào)用此回調(diào)蹄皱。

deactivate(): 當(dāng)State對象從樹中被移除時(shí)览闰。在一些場景下,F(xiàn)lutter framework 會將State對象重新插入到樹中巷折,比如包含此對象的子樹從樹的一個(gè)位置移動(dòng)到另外一個(gè)位置(可以通過GlobalKey來實(shí)現(xiàn))焕济。如果移除后沒有重新插入到樹中則緊接著會調(diào)用dispose() 方法。

dispose(): 當(dāng)State對象永久被移除時(shí)調(diào)用盔几。通常此方法可以用來釋放資源晴弃。

下面是生命周期圖:


State生命周期

在Widget樹中獲取State對象

通過Context獲取

Context對象又一個(gè)findAncestorStateOfType() 方法,該方法可以從當(dāng)前節(jié)點(diǎn)沿著Widget樹向上查找制定類型的State對象逊拍。如下:

ScaffoldState _state = context.findAncestorStateOfType<Scaffold>();

一般來說上鞠,如果StatefulWidget的狀態(tài)是私有的(不應(yīng)該向外部暴露),那么我們代碼中就不應(yīng)該去直接獲取其State對象芯丧;如果StatefulWidget的狀態(tài)是希望暴露出的(通常還有一些組件的操作方法)芍阎,我們則可以去直接獲取其State對象。但是通過context.findAncestorStateOfType獲取StatefulWidget的狀態(tài)的方法是通用的缨恒,我們并不能在語法層面指定StatefulWidget的狀態(tài)是否私有谴咸,所以在Flutter開發(fā)中便有了一個(gè)默認(rèn)的約定:如果StatefulWidget的狀態(tài)是希望暴露出的轮听,應(yīng)當(dāng)在StatefulWidget中提供一個(gè)of靜態(tài)方法來獲取其State對象,開發(fā)者便可直接通過該方法來獲攘爰选血巍;如果State不希望暴露,則不提供of方法珊随。這個(gè)約定在Flutter SDK里隨處可見述寡。所以,上面示例中的Scaffold也提供了一個(gè)of方法叶洞,我們其實(shí)是可以直接調(diào)用它的:

ScaffoldState _state = Scaffold.of(context);

通過GlobalKey

GlobalKey.currentState;

GlobalKey 是Flutter提供的一種在整個(gè)APP中引用element的機(jī)制鲫凶。如果Widget設(shè)置了key屬性,則可以通過globalKey.currentWidget獲得該widget對象衩辟、globalKey.currentElement來獲得widget對應(yīng)的element對象螟炫,如果當(dāng)前widget是StatefulWidget,則可以通過globalKey.currentState來獲得該widget對應(yīng)的state對象

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末艺晴,一起剝皮案震驚了整個(gè)濱河市不恭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌财饥,老刑警劉巖换吧,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異钥星,居然都是意外死亡沾瓦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進(jìn)店門谦炒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來贯莺,“玉大人,你說我怎么就攤上這事宁改÷铺剑” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵还蹲,是天一觀的道長爹耗。 經(jīng)常有香客問我,道長谜喊,這世上最難降的妖魔是什么潭兽? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮斗遏,結(jié)果婚禮上山卦,老公的妹妹穿的比我還像新娘。我一直安慰自己诵次,他們只是感情好账蓉,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布枚碗。 她就那樣靜靜地躺著,像睡著了一般铸本。 火紅的嫁衣襯著肌膚如雪肮雨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天归敬,我揣著相機(jī)與錄音,去河邊找鬼鄙早。 笑死汪茧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的限番。 我是一名探鬼主播舱污,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼弥虐!你這毒婦竟也來了扩灯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤霜瘪,失蹤者是張志新(化名)和其女友劉穎珠插,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颖对,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捻撑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缤底。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片顾患。...
    茶點(diǎn)故事閱讀 40,615評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖个唧,靈堂內(nèi)的尸體忽然破棺而出江解,到底是詐尸還是另有隱情,我是刑警寧澤徙歼,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布犁河,位于F島的核電站,受9級特大地震影響魄梯,放射性物質(zhì)發(fā)生泄漏呼股。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一画恰、第九天 我趴在偏房一處隱蔽的房頂上張望彭谁。 院中可真熱鬧,春花似錦允扇、人聲如沸缠局。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狭园。三九已至读处,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間唱矛,已是汗流浹背罚舱。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绎谦,地道東北人管闷。 一個(gè)月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像窃肠,于是被迫代替她去往敵國和親包个。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評論 2 359

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