Flutter之 State 生命週期

State 的生命週期,指的是在用戶參與的情況下,其關聯的 Widget 所經歷的,從創建到顯示,再到更新最後到停止,直至銷燬等各個階段

不同的階段涉及到特定的任務處理

State 的生命週期流程如下圖所示

file

由圖可知:State 的生命週期可以分爲三個階段:創建(插入視圖樹)、更新(在視圖樹中存在)、銷燬(從視圖樹中移除)

創建

State 初始化時會依次執行:構造方法 -> initState -> didChangeDependencies -> build,隨後完成頁面渲染

  • 構造方法:State 生命週期的起點,Flutter 會通過調用 StatefulWidget.createState() 來創建一個 State。可以通過構造方法,來接收父 Widget 傳遞的初始化 UI 配置數據,而這些配置數據,決定了 Widget 最初的呈現狀態
  • initState:在 State 對象被插入視圖樹時調用。在 State 的生命週期中只會被調用一次,因此可以在 initState 函數中做一些初始化操作
  • didChangeDependencies:專門用來處理 State 對象依賴關係變化,會在 initState() 調用結束後調用
  • build:構建視圖。經過構造方法、initState、didChangeDependencies 後,Framework 認爲 State 已經準備就緒,於是便調用 build。在 build 中,需要根據父 Widget 傳遞過來的初始化配置數據及 State 的當前狀態,創建一個 Widget 然後返回
更新

Widget 的狀態更新,主要由 setState、didChangeDependencies 和 didUpdateWidget 觸發

  • setState:當狀態數據發生變化時,可以通過調用 setState 方法告訴 Flutter 使用更新後數據重建 UI
  • didChangeDependencies:State 對象的依賴關係發生變化後,Flutter 會回調該方法,隨後觸發組件構建。State 對象依賴關係發生變化的典型場景:系統語言 Locale 或應用主題改變時,系統會通知 State 執行 didChangeDependencies 回調方法
  • didUpdateWidget:Widget 的配置發生變化時,或熱重載時,系統會回調該方法

一旦這三個方法被調用,Flutter 隨後便會銷燬舊的 Widget,並調用 build 方法重建 Widget

銷燬

組件銷燬相對創建和更新而言更簡單。比如頁面銷燬時或是組件被移除時,系統會調用 deactivate 和 dispose 這兩個方法,來移除或銷燬組件

  • 當組件的可見狀態發生變化時,deactivate 方法會被調用,這時 State 會被暫時從視圖樹中移除。

注意:頁面切換時,由於 State 對象在視圖樹中的位置發生了變化,需要先暫時移除後再重新添加,重新觸發組件構建,因此也會調用 deactivate 方法

  • 當 State 被永久地從視圖樹中移除時,Flutter 會調用 dispose 方法,而一旦 dispose 方法被調用,組件就要被銷燬了,因此可以在 dispose 方法中進行最終的資源釋放、移除監聽、清理環境等工作

file

file

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章