Easily understand StatefulWidget LifeCycle of Flutter
這篇寫於 2022 年。工具和 API 變化很快,部分步驟可能已經不適用。
掌握 Flutter 重要的生命週期
不管是Flutter還是Android和iOS,開發前建議都先了解相關的生命週期,當有概念之後再進行實作,可以清楚知道每個區塊負責什麼事情。初學者經常想說功能運行都正常應該沒事,但實際上可能只是Bug還沒出現或有效能上的浪費。而當你更了解它後,專案的品質才會良好且穩定。
createState()#
- 創建一個
State,維護Widget狀態和處理元件之間的互動
mounted == true#
- 所有元件都有一個
mounted屬性,布林值 - 表示將
BuildContext分配給 State - BuildContext是 Element 的介面,也代表這個widget在Widget Tree中的位置
- 通常在非同步操作後,可以透過
mounted檢查是否綁定、State是否存在,接著進行setState()
initState()#
- Widget 創建後的初始化(只會呼叫一次)
- 首先調用
super.initState() - 可進行其他初始化,例如Animation、Controller等
- 無法在函式裡使用 context,因為 Element 與 State 還沒有產生關聯
didChangeDependencies()#
- 當父元件的階層改變、Type與Key改變、依賴的InheritedWidget更新都會觸發,並接著執行 build()
didUpdateWidget()#
- 父元件執行setState()或是進行Hot reload,子元件會被通知
setState()在這裡面使用時沒有作用,因為didUpdateWidget()執行完後會執行 build()
reassemble()#
- 為了開發,使用Hot relaod後觸發
- Release模式下就不會被呼叫
reassemble()→didUpdateWidget()→build()
build()#
- 創建 Widget、Widget Tree
deactivate()#
- 當 Widget 從
Widget Tree中被移出後呼叫 - 移出後會等待重新添加到
Widget Tree,可能會在當前幀更改完成之前重新插入樹中,如果未被插入到其他節點時,則會繼續執行dispose() - 可以通過 GlobalKey 來實現,Widget 從樹的一個位置移動到另一個位置,此時不會執行dispose()
dispose()#
- 永久銷毀,釋放資源
mounted屬性會被設置為false,也代表生命週期的結束- 官方說明,
super.dispose()應該作為 Widget-dispose 的最後一個執行函式,資源釋放需要在之前執行,如果在後面則不會處理
其他文章#
- “freezed” makes model class strong and easily
- 提高Flutter性能的小技巧!(一)
- 提高Flutter性能的小技巧!(二)
- 提高Flutter性能的小技巧!(三)
- What are Async and Isolates in Flutter?
- LoadBalancer is optimization for Isolates in Flutter
- Flutter 3 有什麼新東西?
- Riverpod 輕鬆學,原來這麼好用!
- Riverpod 輕鬆學(二),一些進階用法!
關於我#
- Github: https://github.com/chyiiiiiiiiiiii
- Linkedin: https://www.linkedin.com/in/yiichenhi/
- Youtube: Yii
- Youtube: 一起饅頭(美食頻道)
- Instagram: flutterluvr.yii
- Email: ab20803@gmail.com
贊助#
謝謝你!這是一個很長的文章而且你花費時間看完,真的非常感謝。
還有一件事, 如果覺得文章不錯可以贊助我,讓我有更多的動力和熱情分享 學習筆記和生活!請我喝一杯咖啡吧~
最後#
希望有幫助到你/妳,歡迎追蹤我,方便瀏覽最新的文章,也請別忘記給我拍手哦 (最多可以達到50次)!
本文原刊登於 Medium。