flutter中state详解
State
在說到StatefulWidget之前,先說下State。State的作用有兩點:
State生命周期
State的生命周期有四種狀態(tài):
- created:當(dāng)State對象被創(chuàng)建時候,State.initState方法會被調(diào)用;
- initialized:當(dāng)State對象被創(chuàng)建,但還沒有準(zhǔn)備構(gòu)建時,State.didChangeDependencies在這個時候會被調(diào)用;
- ready:State對象已經(jīng)準(zhǔn)備好了構(gòu)建,State.dispose沒有被調(diào)用的時候;
- defunct:State.dispose被調(diào)用后,State對象不能夠被構(gòu)建。
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Txxq1QXj-1612666084611)(http://whysodiao.com/images/State LifeCycle.png)]
完整生命周期如下:
- 創(chuàng)建一個State對象時,會調(diào)用StatefulWidget.createState;
- 和一個BuildContext相關(guān)聯(lián),可以認(rèn)為被加載了(mounted);
- 調(diào)用initState;
- 調(diào)用didChangeDependencies;
- 經(jīng)過上述步驟,State對象被完全的初始化了,調(diào)用build;
- 如果有需要,會調(diào)用didUpdateWidget;
- 如果處在開發(fā)模式,熱加載會調(diào)用reassemble;
- 如果它的子樹(subtree)包含需要被移除的State對象,會調(diào)用deactivate;
- 調(diào)用dispose,State對象以后都不會被構(gòu)建;
- 當(dāng)調(diào)用了dispose,State對象處于未加載(unmounted),已經(jīng)被dispose的State對象沒有辦法被重新加載(remount)。
setState
State中比較重要的一個方法是setState,當(dāng)修改狀態(tài)時,widget會被更新。比方說點擊CheckBox,會出現(xiàn)選中和非選中狀態(tài)之間的切換,就是通過修改狀態(tài)來達(dá)到的。
查看setState源碼,在一些異常的情況下將會拋出異常:
- 傳入的為null;
- 處在defunct階段;
- created階段還沒有被加載(mounted);
- 參數(shù)返回一個Future對象。
檢查完一系列異常后,最后調(diào)用代碼如下:
_element.markNeedsBuild();markNeedsBuild內(nèi)部,則是通過標(biāo)記element為dirty,在下一幀的時候重建(rebuild)。可以看出setState并不是立即生效,它只是將widget進(jìn)行了標(biāo)記,真正的rebuild操作,則是等到下一幀的時候才會去進(jìn)行。
StatefulWidget和StatelessWidget
StatefulWidget和StatelessWidget如下所示
一個StatelessWidget可以用多個不同的BuildContext構(gòu)建,而一個StatefulWidget會為每個BuildContext創(chuàng)建一個State對象。
StatelessWidget
對于StatelessWidget,build方法會在如下三種情況下調(diào)用,
StatefulWidget
StatefulWidget的兩個主要類別:
ld(BuildContext context) {
return new Container(color: const Color(0xFFFFE306));
}
}
總結(jié)
以上是生活随笔為你收集整理的flutter中state详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Flutter+百度人工智能实现测验值a
- 下一篇: 谈谈如何学习flutter之flutte