Flutter 54: 圖解基本生命周期

??????小菜使用 Flutter 這么長時間,并沒有認(rèn)真研究過 Flutter 的生命周期,今天小菜分幾個場景學(xué)習(xí)一下 Flutter 的生命周期;

??????小菜借助 WidgetsBinding 通過觀察和監(jiān)聽 didChangeAppLifecycleState 來分析生命周期事件,與 Android 原生類似;

基本場景

1. 初始化

initState -> didChangeDependencies -> build

2. 頁面數(shù)據(jù)更新

??????小菜嘗試頁面按鈕點擊或彈框處理,均不會涉及生命周期變化,只是在 build 更新 Widget 資源;但是若進(jìn)行 熱重載 生命周期如下:

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

進(jìn)階場景

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. 進(jìn)入分屏窗口

didChangeAppLifecycleState(AppLifecycleState.inactive) -> didChangeAppLifecycleState(AppLifecycleState.paused) -> build (與切至后臺相同)

12. 進(jìn)行分屏

didChangeAppLifecycleState(AppLifecycleState.inactive) -> didChangeAppLifecycleState(AppLifecycleState.resumed) -> didChangeAppLifecycleState(AppLifecycleState.inactive) -> build

13. 獲取焦點

didChangeAppLifecycleState(AppLifecycleState.resumed) -> build

14. 屏幕大小調(diào)整

??????與 Android 不同,調(diào)整屏幕大小不會進(jìn)行生命周期變化,前提是當(dāng)前應(yīng)用已獲取焦點,若未獲取焦點,則會在調(diào)整屏幕大小為全屏?xí)r進(jìn)行獲取焦點的生命周期方法;

小總結(jié)

  1. 生命周期整體分為三個部分:初始化 / 狀態(tài)改變 / 銷毀;
  2. initState 在整個生命周期中的初始化階段只會調(diào)用一次;
  3. didChangeDependencies 當(dāng) State 對象依賴發(fā)生變動時調(diào)用;
  4. didUpdateWidget 當(dāng) Widget 狀態(tài)發(fā)生改變時調(diào)用;實際上每次更新狀態(tài)時,Flutter 會創(chuàng)建一個新的 Widget,并在該函數(shù)中進(jìn)行新舊 Widget 對比;一般調(diào)用該方法之后會調(diào)用 build;
  5. reassemble 只有在 debug熱重載 時調(diào)用;
  6. deactivateWidget Tree 中移除 State 對象時會調(diào)用,一般用在 dispose 之前;
  7. dispose 用于 Widget 被銷毀時,通常會在此方法中移除監(jiān)聽或清理數(shù)據(jù)等,整個生命周期只會執(zhí)行一次;
  8. resumed 應(yīng)用程序可見且獲取焦點狀態(tài),類似于 Android onResume();
  9. inactive 應(yīng)用程序處于非活動狀態(tài);
  10. paused 應(yīng)用程序處于用戶不可見,不響應(yīng)用戶狀態(tài),處于后臺運行狀態(tài),類似于 Android onPause();

??????生命周期非常重要也非常有趣,值得我們多多嘗試和研究,小菜僅嘗試了幾種常見的情況,如有錯誤請多多指導(dǎo)!

來源:阿策小和尚

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Flutter 中的生命周期 flutter 也有自己的生命周期,但跟 Android 比起來就顯得弱化了,官方定...
    wethereornot閱讀 8,439評論 3 3
  • Flutter跟安卓的Activity、iOS的ViewController一樣擁有自己的生命周期, Flutte...
    三也視界閱讀 58,633評論 3 31
  • 項目地址:https://github.com/Code-Yeong/FlutterDemo 1、引言 在開發(fā)fl...
    看不見的手_閱讀 1,632評論 1 5
  • 本來,覺得很不公平。 憑什么好人成佛,需要歷經(jīng)九九八十一難;而壞人,只需放下屠刀。 后來真正平息憤懣,仔細(xì)思考這個...
    丹心明月_LM閱讀 480評論 0 2
  • 今天媽媽過生日,一早起來我就和媽媽說生日快樂,媽媽的心情很美麗,中午回家后看到了我和爸爸為她準(zhǔn)備的禮物,心情...
    6ea93bce25e9閱讀 230評論 0 0

友情鏈接更多精彩內(nèi)容