Flutter跟安卓的Activity、iOS的ViewController一樣擁有自己的生命周期, Flutter中一切都是Widget,渲染方式有點像H5的DOM樹。
先看生命周期圖:

Flutter生命周期可以分為3個階段:
1、實例化組件并添加到樹, 即Navigator.push;
2、狀態(tài)變化,即打開新的widget或者依賴的上級widget發(fā)生變化;
3、從樹中移除, 即Navigator.pop。
在Flutter中Widget都是不可變的, 但實際上需要根據(jù)對應(yīng)的狀態(tài)刷新Widget。 從而產(chǎn)生了StatelessWidget和StatefulWdiget, StatefulWidget是由2個對象Widget和State組成的。
為什么將State和Widget分開呢?
答案是性能, State管理狀態(tài)(可以理解為Controller),Widget是UI(即View)。 根據(jù)狀態(tài)變化每次生成Widget(即View)可以節(jié)省內(nèi)存,即不必每次創(chuàng)建狀態(tài)對象State。
構(gòu)造函數(shù):
同其它高級語言, 只執(zhí)行一次;
initState:
插入到渲染樹時調(diào)用,只執(zhí)行一次。(類似Android Fragment的onCreateView函數(shù))
didChangeDependencies:
1、在初始化initState后執(zhí)行; 2、顯示/關(guān)閉其它widget。 3、可執(zhí)行多次;
didUpdateWidget:
上級節(jié)點rebuild widget時, 即上級組件狀態(tài)發(fā)生變化時會觸發(fā)子widget執(zhí)行didUpdateWidget;
deative:
有點像Android的onStop函數(shù), 在打開新的Widget或回到這個widget時會執(zhí)行; 可執(zhí)行多次;
dispose:
類似于Android的onDestroy, 在執(zhí)行Navigator.pop后會調(diào)用該辦法, 表示組件已銷毀;
reassemble:
點擊閃電會執(zhí)行,只用于調(diào)試時的hot reload。 release版本不會執(zhí)行該函數(shù)。
常見業(yè)務(wù)場景:
Widget A打開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打開、關(guān)閉Widget時跟安卓、iOS的時序一樣, 都是先處理即將顯示的界面。
activity生命周期和Flutter對應(yīng)關(guān)系:
Flutter提供了WidgetsBindingObserver來監(jiān)聽AppLifecycleState, 而AppLifecycleState有4種狀態(tài):
1、 resumed 界面可見, 同安卓的onResume。
2、inactive界面退到后臺或彈出對話框情況下, 即失去了焦點但仍可以執(zhí)行drawframe回調(diào);同安卓的onPause;
3、paused應(yīng)用掛起,比如退到后臺,失去了焦點且不會收到drawframe回調(diào);同安卓的onStop;
4、suspending, iOS中沒用,安卓里就是掛起,不會再執(zhí)行drawframe回調(diào);
下面是生命周期:
1、初次打開widget時,不執(zhí)行AppLifecycleState的回調(diào);
2、按home鍵或Power鍵, AppLifecycleState inactive---->AppLifecycleState pause
3、從后臺到前臺: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實現(xiàn), 從而補(bǔ)全Flutter的生命周期。
</article>
22人點贊
作者:三也視界
鏈接:http://www.itdecent.cn/p/7e8dff26f81a
來源:簡書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。