Flutter 中的生命周期
flutter 也有自己的生命周期,但跟 Android 比起來就顯得弱化了,官方定義的生命周期只有五個苍匆,實際應用中還需要WidgetsBindingObserver接口的配合,才能像android中那樣 “為所欲為”介汹。
initState() 表示當前 State 將和一個 BuildContext 產生關聯(lián)笋妥,但是此時BuildContext
沒有完全裝載完成,如果你需要在該方法中獲取 BuildContext 爽蝴,可以 new Future.delayed(const Duration(seconds: 0, (){//context}); 一下沐批。didChangeDependencies() 在 initState() 之后調用,當 State 對象的依賴關系發(fā)生變化時蝎亚,該方法被調用九孩,初始化時也會調用。
deactivate() 當 State 被暫時從視圖樹中移除時发框,會調用這個方法躺彬,同時頁面切換時,也會調用梅惯。
dispose() Widget 銷毀了宪拥,在調用這個方法之前,總會先調用 deactivate()铣减。
didUpdateWidge 當 widget 狀態(tài)發(fā)生變化時她君,會調用。
常見業(yè)務場景:
1.Widget A打開Widget B: 調用 Navigator.push(B)
- B構造函數(shù)--->B initState--->B didChangeDependencies--->B build--->A deactivate--->A didChangeDependencies.
2.Widget B退出: Navigator.pop
- A deactivate--->A didChangeDependencies--->A build--->B deactivate--->B dispose
可以看出葫哗, Flutter打開缔刹、關閉Widget時跟安卓、iOS的時序一樣劣针, 都是先處理即將顯示的界面校镐。
activity生命周期和Flutter對應關系:
Flutter提供了WidgetsBindingObserver來監(jiān)聽AppLifecycleState, 而AppLifecycleState有4種狀態(tài):
1捺典、 resumed 界面可見鸟廓, 同安卓的onResume。
2襟己、inactive界面退到后臺或彈出對話框情況下引谜, 即失去了焦點但仍可以執(zhí)行drawframe回調;同安卓的onPause稀蟋;
3煌张、paused應用掛起,比如退到后臺退客,失去了焦點且不會收到 drawframe 回調骏融;同安卓的onStop;
4萌狂、suspending档玻, iOS中沒用,安卓里就是掛起茫藏,不會再執(zhí)行 drawframe 回調误趴;
下面是生命周期:
1、初次打開widget時务傲,不執(zhí)行AppLifecycleState的回調凉当;
2枣申、按home鍵或Power鍵, AppLifecycleState inactive---->AppLifecycleState pause
3看杭、從后臺到前臺:AppLifecycleState inactive--->ApplifecycleState resumed
4忠藤、back鍵退出應用: 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);
}
...
}