State 的生命周期心俗,指的是在用戶參與的情況下,其關(guān)聯(lián)的 Widget 所經(jīng)歷的币厕,從創(chuàng)建到顯示,再到更新最后到停止芽腾,直至銷毀等各個階段
不同的階段涉及到特定的任務(wù)處理
State 的生命周期流程如下圖所示
由圖可知:State 的生命周期可以分為三個階段:創(chuàng)建(插入視圖樹)旦装、更新(在視圖樹中存在)、銷毀(從視圖樹中移除)
創(chuàng)建
State 初始化時會依次執(zhí)行:構(gòu)造方法 -> initState -> didChangeDependencies -> build摊滔,隨后完成頁面渲染
- 構(gòu)造方法:State 生命周期的起點阴绢,F(xiàn)lutter 會通過調(diào)用 StatefulWidget.createState() 來創(chuàng)建一個 State〔言兀可以通過構(gòu)造方法旱函,來接收父 Widget 傳遞的初始化 UI 配置數(shù)據(jù),而這些配置數(shù)據(jù)描滔,決定了 Widget 最初的呈現(xiàn)狀態(tài)
- initState:在 State 對象被插入視圖樹時調(diào)用棒妨。在 State 的生命周期中只會被調(diào)用一次,因此可以在 initState 函數(shù)中做一些初始化操作
- didChangeDependencies:專門用來處理 State 對象依賴關(guān)系變化含长,會在 initState() 調(diào)用結(jié)束后調(diào)用
- build:構(gòu)建視圖券腔。經(jīng)過構(gòu)造方法、initState拘泞、didChangeDependencies 后纷纫,F(xiàn)ramework 認(rèn)為 State 已經(jīng)準(zhǔn)備就緒,于是便調(diào)用 build陪腌。在 build 中辱魁,需要根據(jù)父 Widget 傳遞過來的初始化配置數(shù)據(jù)及 State 的當(dāng)前狀態(tài)烟瞧,創(chuàng)建一個 Widget 然后返回
更新
Widget 的狀態(tài)更新,主要由 setState染簇、didChangeDependencies 和 didUpdateWidget 觸發(fā)
- setState:當(dāng)狀態(tài)數(shù)據(jù)發(fā)生變化時参滴,可以通過調(diào)用 setState 方法告訴 Flutter 使用更新后數(shù)據(jù)重建 UI
- didChangeDependencies:State 對象的依賴關(guān)系發(fā)生變化后,F(xiàn)lutter 會回調(diào)該方法锻弓,隨后觸發(fā)組件構(gòu)建砾赔。State 對象依賴關(guān)系發(fā)生變化的典型場景:系統(tǒng)語言 Locale 或應(yīng)用主題改變時,系統(tǒng)會通知 State 執(zhí)行 didChangeDependencies 回調(diào)方法
- didUpdateWidget:Widget 的配置發(fā)生變化時青灼,或熱重載時暴心,系統(tǒng)會回調(diào)該方法
一旦這三個方法被調(diào)用,F(xiàn)lutter 隨后便會銷毀舊的 Widget杂拨,并調(diào)用 build 方法重建 Widget
銷毀
組件銷毀相對創(chuàng)建和更新而言更簡單专普。比如頁面銷毀時或是組件被移除時,系統(tǒng)會調(diào)用 deactivate 和 dispose 這兩個方法扳躬,來移除或銷毀組件
- 當(dāng)組件的可見狀態(tài)發(fā)生變化時脆诉,deactivate 方法會被調(diào)用,這時 State 會被暫時從視圖樹中移除贷币。
注意:頁面切換時击胜,由于 State 對象在視圖樹中的位置發(fā)生了變化,需要先暫時移除后再重新添加役纹,重新觸發(fā)組件構(gòu)建偶摔,因此也會調(diào)用 deactivate 方法 - 當(dāng) State 被永久地從視圖樹中移除時,F(xiàn)lutter 會調(diào)用 dispose 方法促脉,而一旦 dispose 方法被調(diào)用辰斋,組件就要被銷毀了,因此可以在 dispose 方法中進行最終的資源釋放瘸味、移除監(jiān)聽宫仗、清理環(huán)境等工作