yii.
← Writing
Flutter 技術 · · 2 min read

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 的最後一個執行函式,資源釋放需要在之前執行,如果在後面則不會處理

其他文章#

關於我#

贊助#

謝謝你!這是一個很長的文章而且你花費時間看完,真的非常感謝。

還有一件事, 如果覺得文章不錯可以贊助我,讓我有更多的動力和熱情分享 學習筆記和生活!請我喝一杯咖啡吧~

https://www.buymeacoffee.com/yiichenhi

最後#

希望有幫助到你/妳,歡迎追蹤我,方便瀏覽最新的文章,也請別忘記給我拍手哦 (最多可以達到50次)!

本文原刊登於 Medium。