initState():當(dāng)Widget第一次插入到Widget樹時(shí)會(huì)被調(diào)用中跌,對(duì)于每一個(gè)State對(duì)象馋劈,F(xiàn)lutter framework只會(huì)調(diào)用一次該回調(diào)维蒙,所以简烤,通常在該回調(diào)中做一些一次性的操作,如狀態(tài)初始化洲愤、訂閱子樹的事件通知等颓芭。不能在該回調(diào)中調(diào)用BuildContext.dependOnInheritedWidgetOfExactType,原因是在初始化完成后柬赐,Widget樹中的InheritFromWidget也可能會(huì)發(fā)生變化亡问,所以正確的做法應(yīng)該在在build()方法或didChangeDependencies()中調(diào)用它。
didChangeDependencies():當(dāng)State對(duì)象的依賴發(fā)生變化時(shí)會(huì)被調(diào)用肛宋;例如:在之前build() 中包含了一個(gè)InheritedWidget玛界,然后在之后的build() 中InheritedWidget發(fā)生了變化万矾,那么此時(shí)InheritedWidget的子widget的didChangeDependencies()回調(diào)都會(huì)被調(diào)用。典型的場(chǎng)景是當(dāng)系統(tǒng)語言Locale或應(yīng)用主題改變時(shí)慎框,F(xiàn)lutter framework會(huì)通知widget調(diào)用此回調(diào)良狈。
build():它主要是用于構(gòu)建Widget子樹的,會(huì)在如下場(chǎng)景被調(diào)用:
在調(diào)用initState()之后笨枯。
在調(diào)用didUpdateWidget()之后薪丁。
在調(diào)用setState()之后。
在調(diào)用didChangeDependencies()之后馅精。
在State對(duì)象從樹中一個(gè)位置移除后(會(huì)調(diào)用deactivate)又重新插入到樹的其它位置之后严嗜。
reassemble():此回調(diào)是專門為了開發(fā)調(diào)試而提供的,在熱重載(hot reload)時(shí)會(huì)被調(diào)用洲敢,此回調(diào)在Release模式下永遠(yuǎn)不會(huì)被調(diào)用漫玄。
didUpdateWidget():在widget重新構(gòu)建時(shí),F(xiàn)lutter framework會(huì)調(diào)用Widget.canUpdate來檢測(cè)Widget樹中同一位置的新舊節(jié)點(diǎn)压彭,然后決定是否需要更新睦优,如果Widget.canUpdate返回true則會(huì)調(diào)用此回調(diào)。正如之前所述壮不,Widget.canUpdate會(huì)在新舊widget的key和runtimeType同時(shí)相等時(shí)會(huì)返回true汗盘,也就是說在在新舊widget的key和runtimeType同時(shí)相等時(shí)didUpdateWidget()就會(huì)被調(diào)用。
deactivate():當(dāng)State對(duì)象從樹中被移除時(shí)询一,會(huì)調(diào)用此回調(diào)隐孽。在一些場(chǎng)景下,F(xiàn)lutter framework會(huì)將State對(duì)象重新插到樹中健蕊,如包含此State對(duì)象的子樹在樹的一個(gè)位置移動(dòng)到另一個(gè)位置時(shí)(可以通過GlobalKey來實(shí)現(xiàn))菱阵。如果移除后沒有重新插入到樹中則緊接著會(huì)調(diào)用dispose()方法。
dispose():當(dāng)State對(duì)象從樹中被永久移除時(shí)調(diào)用缩功;通常在此回調(diào)中釋放資源晴及。