??????小菜使用 Flutter 這么長時間筒繁,并沒有認真研究過 Flutter 的生命周期噩凹,今天小菜分幾個場景學習一下 Flutter 的生命周期;
??????小菜借助 WidgetsBinding 通過觀察和監(jiān)聽 didChangeAppLifecycleState 來分析生命周期事件毡咏,與 Android 原生類似驮宴;
基本場景
1. 初始化
initState -> didChangeDependencies -> build
2. 頁面數(shù)據(jù)更新
??????小菜嘗試頁面按鈕點擊或彈框處理,均不會涉及生命周期變化呕缭,只是在 build 更新 Widget 資源堵泽;但是若進行 熱重載 生命周期如下:
reassemble -> didUpdateWidget -> build
3. 橫豎屏切換
didUpdateWidget -> build -> didUpdateWidget -> build (執(zhí)行兩次)
4. 切至后臺
didChangeAppLifecycleState(AppLifecycleState.inactive) -> didChangeAppLifecycleState(AppLifecycleState.paused) -> build
5. 切回前臺
didChangeAppLifecycleState(AppLifecycleState.inactive) -> didChangeAppLifecycleState(AppLifecycleState.resumed) -> build
6. 銷毀頁面
deactivate -> dispose
進階場景
7. 打開新的頁面
新頁面initState -> didChangeDependencies -> build -> 舊頁面deactivate -> didChangeDependencies -> build (新頁面初始化+舊頁面置于后臺)
8. 新頁面切至后臺(舊頁面未銷毀)
舊/新頁面didChangeAppLifecycleState(AppLifecycleState.inactive) -> didChangeAppLifecycleState(AppLifecycleState.paused) -> build
9. 新頁面切回前臺
舊/新頁面didChangeAppLifecycleState(AppLifecycleState.inactive) -> didChangeAppLifecycleState(AppLifecycleState.resumed) -> build
10. 新頁面銷毀
舊頁面deactivate -> build(AppLifecycleState.resumed) -> 新頁面deactivate -> dispose
特殊場景
??????小菜也嘗試了一下 Android7.0 分屏情況下的生命周期;
11. 進入分屏窗口
didChangeAppLifecycleState(AppLifecycleState.inactive) -> didChangeAppLifecycleState(AppLifecycleState.paused) -> build (與切至后臺相同)
12. 進行分屏
didChangeAppLifecycleState(AppLifecycleState.inactive) -> didChangeAppLifecycleState(AppLifecycleState.resumed) -> didChangeAppLifecycleState(AppLifecycleState.inactive) -> build
13. 獲取焦點
didChangeAppLifecycleState(AppLifecycleState.resumed) -> build
14. 屏幕大小調(diào)整
??????與 Android 不同恢总,調(diào)整屏幕大小不會進行生命周期變化迎罗,前提是當前應用已獲取焦點,若未獲取焦點片仿,則會在調(diào)整屏幕大小為全屏時進行獲取焦點的生命周期方法纹安;
小總結
- 生命周期整體分為三個部分:初始化 / 狀態(tài)改變 / 銷毀;
- initState 在整個生命周期中的初始化階段只會調(diào)用一次砂豌;
- didChangeDependencies 當 State 對象依賴發(fā)生變動時調(diào)用厢岂;
- didUpdateWidget 當 Widget 狀態(tài)發(fā)生改變時調(diào)用;實際上每次更新狀態(tài)時阳距,Flutter 會創(chuàng)建一個新的 Widget塔粒,并在該函數(shù)中進行新舊 Widget 對比;一般調(diào)用該方法之后會調(diào)用 build筐摘;
- reassemble 只有在 debug 或 熱重載 時調(diào)用卒茬;
- deactivate 從 Widget Tree 中移除 State 對象時會調(diào)用映跟,一般用在 dispose 之前;
- dispose 用于 Widget 被銷毀時扬虚,通常會在此方法中移除監(jiān)聽或清理數(shù)據(jù)等努隙,整個生命周期只會執(zhí)行一次;
- resumed 應用程序可見且獲取焦點狀態(tài)辜昵,類似于 Android onResume()荸镊;
- inactive 應用程序處于非活動狀態(tài);
-
paused 應用程序處于用戶不可見堪置,不響應用戶狀態(tài)躬存,處于后臺運行狀態(tài),類似于 Android onPause()舀锨;
??????生命周期非常重要也非常有趣岭洲,值得我們多多嘗試和研究,小菜僅嘗試了幾種常見的情況坎匿,如有錯誤請多多指導盾剩!
來源:阿策小和尚