1.Flutter中生命周期:
flutter也有自己的生命周期,不像Android中Application、Activity汽抚、Fragment生命周期分得這么明細(xì)精算,flutter中只在StatefulWidget維護(hù)的State中維護(hù)了5個(gè)生命周期函數(shù)(可用于App中的頁(yè)面跳轉(zhuǎn),相當(dāng)于Android中View的生命周期)柜候。而Activity中的生命周期可以通過(guò)實(shí)現(xiàn)WidgetsBindingObserver 接口搞动,在didChangeAppLifecycleState()中獲取狀態(tài)回調(diào)。
1.1StatefulWidget:
initState()-->didChangeDependencies()-->deactivate()-->dispose() didUpdateWidge()
initState(): 表示當(dāng)前 State 將和一個(gè) BuildContext 產(chǎn)生關(guān)聯(lián)改橘,但是此時(shí)BuildContext
沒(méi)有完全裝載完成滋尉,如果你需要在該方法中獲取 BuildContext ,可以 new Future.delayed(const Duration(seconds: 0, (){//context}); 一下飞主。didChangeDependencies(): 在 initState() 之后調(diào)用狮惜,當(dāng) State 對(duì)象的依賴(lài)關(guān)系發(fā)生變化時(shí)高诺,該方法被調(diào)用,初始化時(shí)也會(huì)調(diào)用碾篡。
deactivate(): 當(dāng) State 被暫時(shí)從視圖樹(shù)中移除時(shí)虱而,會(huì)調(diào)用這個(gè)方法,同時(shí)頁(yè)面切換時(shí)开泽,也會(huì)調(diào)用牡拇。頁(yè)面路由切換的時(shí)候push()、pop()都會(huì)回調(diào)這個(gè)函數(shù)穆律。
dispose(): Widget 銷(xiāo)毀了惠呼,在調(diào)用這個(gè)方法之前,總會(huì)先調(diào)用 deactivate()峦耘。
didUpdateWidget(): 當(dāng) widget 狀態(tài)發(fā)生變化時(shí)剔蹋,會(huì)調(diào)用。
1.2常見(jiàn)業(yè)務(wù)場(chǎng)景:
1.Widget A打開(kāi)Widget B: 調(diào)用 Navigator.push(B)
- B構(gòu)造函數(shù)--->B initState()--->B didChangeDependencies()--->B build()--->A deactivate()--->A didChangeDependencies().
2.Widget B從Widget A退出: 調(diào)用Navigator.pop()
- A deactivate()--->A didChangeDependencies()--->A build()--->B deactivate()--->B dispose()
可以看出辅髓, Flutter打開(kāi)泣崩、關(guān)閉Widget時(shí)跟安卓、iOS的時(shí)序一樣洛口, 都是先處理即將顯示的界面矫付。
1.3Activity生命周期和Flutter的對(duì)應(yīng)關(guān)系(主要依賴(lài)WidgetsBindingObserver 接口):
Flutter提供了WidgetsBindingObserver來(lái)監(jiān)聽(tīng)AppLifecycleState, 而AppLifecycleState有4種狀態(tài):
1第焰、 resumed 界面可見(jiàn)买优, 同安卓的onResume。
2樟遣、inactive界面退到后臺(tái)或彈出對(duì)話(huà)框情況下而叼, 即失去了焦點(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)秤朗;
5、關(guān)于drawframe回調(diào):Vsync信號(hào)到來(lái)之后笔喉,Engin會(huì)按順序回調(diào)window
的兩個(gè)回調(diào)函數(shù):onBeginFrame()
和onDrawFrame()
取视。這兩個(gè)回調(diào)是SchedulerBinding
初始化的時(shí)候設(shè)置給window
的硝皂。對(duì)應(yīng)的是SchedulerBinding.handleBeginFrame()
和SchedulerBinding.handleDrawFrame()
。
應(yīng)用場(chǎng)景:
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 _TabBarState extends State<TabBarPage> with TickerProviderStateMixin ,WidgetsBindingObserver{
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
// state對(duì)應(yīng)生命周期回調(diào)
print('AsyncSnapshotLifeCycle:' + state.toString());
super.didChangeAppLifecycleState(state);
}
}