Flutter跟安卓的Activity、iOS的ViewController一樣擁有自己的生命周期虑粥, Flutter中一切都是Widget很洋,渲染方式有點(diǎn)像H5的DOM樹(shù)。
先看生命周期圖:
Flutter生命周期可以分為3個(gè)階段:
1岁诉、實(shí)例化組件并添加到樹(shù)锚沸, 即Navigator.push;
2涕癣、狀態(tài)變化哗蜈,即打開(kāi)新的widget或者依賴的上級(jí)widget發(fā)生變化;
3坠韩、從樹(shù)中移除, 即Navigator.pop距潘。
在Flutter中Widget都是不可變的, 但實(shí)際上需要根據(jù)對(duì)應(yīng)的狀態(tài)刷新Widget只搁。 從而產(chǎn)生了StatelessWidget和StatefulWdiget, StatefulWidget是由2個(gè)對(duì)象Widget和State組成的音比。
為什么將State和Widget分開(kāi)呢?
答案是性能须蜗, State管理狀態(tài)(可以理解為Controller)硅确,Widget是UI(即View)目溉。 根據(jù)狀態(tài)變化每次生成Widget(即View)可以節(jié)省內(nèi)存,即不必每次創(chuàng)建狀態(tài)對(duì)象State菱农。
構(gòu)造函數(shù):
同其它高級(jí)語(yǔ)言缭付, 只執(zhí)行一次;
initState:
插入到渲染樹(shù)時(shí)調(diào)用循未,只執(zhí)行一次陷猫。(類似Android Fragment的onCreateView函數(shù))
didChangeDependencies:
1、在初始化initState后執(zhí)行的妖; 2绣檬、顯示/關(guān)閉其它widget。 3嫂粟、可執(zhí)行多次娇未;
didUpdateWidget:
上級(jí)節(jié)點(diǎn)rebuild widget時(shí), 即上級(jí)組件狀態(tài)發(fā)生變化時(shí)會(huì)觸發(fā)子widget執(zhí)行didUpdateWidget;
deative:
有點(diǎn)像Android的onStop函數(shù)星虹, 在打開(kāi)新的Widget或回到這個(gè)widget時(shí)會(huì)執(zhí)行零抬; 可執(zhí)行多次;
dispose:
類似于Android的onDestroy宽涌, 在執(zhí)行Navigator.pop后會(huì)調(diào)用該辦法平夜, 表示組件已銷毀;
reassemble:
點(diǎn)擊閃電會(huì)執(zhí)行卸亮,只用于調(diào)試時(shí)的hot reload忽妒。 release版本不會(huì)執(zhí)行該函數(shù)。
常見(jiàn)業(yè)務(wù)場(chǎng)景:
Widget A打開(kāi)Widget B: Navigator.push(B)
B構(gòu)造函數(shù)--->B initState--->B didChangeDependencies--->B build--->A deactive--->A didChangeDependencies.
Widget B退出: Navigator.pop
A deactive--->A didChangeDependencies--->A build--->B deactive--->B dispose
可以看出兼贸, Flutter打開(kāi)段直、關(guān)閉Widget時(shí)跟安卓、iOS的時(shí)序一樣寝受, 都是先處理即將顯示的界面坷牛。
activity生命周期和Flutter對(duì)應(yīng)關(guān)系:
Flutter提供了WidgetsBindingObserver來(lái)監(jiān)聽(tīng)AppLifecycleState, 而AppLifecycleState有4種狀態(tài):
1很澄、 resumed 界面可見(jiàn)京闰, 同安卓的onResume。
2甩苛、inactive界面退到后臺(tái)或彈出對(duì)話框情況下蹂楣, 即失去了焦點(diǎn)但仍可以執(zhí)行drawframe回調(diào);同安卓的onPause讯蒲;
3痊土、paused應(yīng)用掛起,比如退到后臺(tái)墨林,失去了焦點(diǎn)且不會(huì)收到drawframe回調(diào)赁酝;同安卓的onStop犯祠;
4、suspending酌呆, iOS中沒(méi)用衡载,安卓里就是掛起,不會(huì)再執(zhí)行drawframe回調(diào)隙袁;
下面是生命周期:
1痰娱、初次打開(kāi)widget時(shí),不執(zhí)行AppLifecycleState的回調(diào)菩收;
2梨睁、按home鍵或Power鍵, AppLifecycleState inactive---->AppLifecycleState pause
3娜饵、從后臺(tái)到前臺(tái):AppLifecycleState inactive--->ApplifecycleState resumed
4坡贺、back鍵退出應(yīng)用: AppLifecycleState inactive--->AppLifecycleState paused
class _MyHomePageState extends State<MyHomePage> with WidgetsBindingObserver {
AppLifecycleState _lastLifecycleState;
void dispose() {
super.dispose();
WidgetsBinding.instance.removeObserver(this);
}
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
print(state);
}
...
}
如果還需要其它事件,則可以用EventChannel實(shí)現(xiàn)划咐, 從而補(bǔ)全Flutter的生命周期拴念。