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)用盔几。通常此方法可以用來釋放資源晴弃。
下面是生命周期圖:
在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對象