State 的生命周期柜蜈,指的是在用戶(hù)參與的情況下,其關(guān)聯(lián)的 Widget 所經(jīng)歷的逆趣,從創(chuàng)建到顯示,再到更新最后到停止荣赶,直至銷(xiāo)毀等各個(gè)階段
不同的階段涉及到特定的任務(wù)處理
State 的生命周期流程如下圖所示
由圖可知:State 的生命周期可以分為三個(gè)階段:創(chuàng)建(插入視圖樹(shù))、更新(在視圖樹(shù)中存在)、銷(xiāo)毀(從視圖樹(shù)中移除)
創(chuàng)建
State 初始化時(shí)會(huì)依次執(zhí)行:構(gòu)造方法 -> initState -> didChangeDependencies -> build,隨后完成頁(yè)面渲染
- 構(gòu)造方法:State 生命周期的起點(diǎn)桅狠,F(xiàn)lutter 會(huì)通過(guò)調(diào)用 StatefulWidget.createState() 來(lái)創(chuàng)建一個(gè) State〗窝恚可以通過(guò)構(gòu)造方法垂攘,來(lái)接收父 Widget 傳遞的初始化 UI 配置數(shù)據(jù),而這些配置數(shù)據(jù)淤刃,決定了 Widget 最初的呈現(xiàn)狀態(tài)
- initState:在 State 對(duì)象被插入視圖樹(shù)時(shí)調(diào)用。在 State 的生命周期中只會(huì)被調(diào)用一次吱型,因此可以在 initState 函數(shù)中做一些初始化操作
- didChangeDependencies:專(zhuān)門(mén)用來(lái)處理 State 對(duì)象依賴(lài)關(guān)系變化逸贾,會(huì)在 initState() 調(diào)用結(jié)束后調(diào)用
- build:構(gòu)建視圖。經(jīng)過(guò)構(gòu)造方法津滞、initState铝侵、didChangeDependencies 后,F(xiàn)ramework 認(rèn)為 State 已經(jīng)準(zhǔn)備就緒触徐,于是便調(diào)用 build咪鲜。在 build 中,需要根據(jù)父 Widget 傳遞過(guò)來(lái)的初始化配置數(shù)據(jù)及 State 的當(dāng)前狀態(tài)撞鹉,創(chuàng)建一個(gè) Widget 然后返回
更新
Widget 的狀態(tài)更新疟丙,主要由 setState颖侄、didChangeDependencies 和 didUpdateWidget 觸發(fā)
- setState:當(dāng)狀態(tài)數(shù)據(jù)發(fā)生變化時(shí),可以通過(guò)調(diào)用 setState 方法告訴 Flutter 使用更新后數(shù)據(jù)重建 UI
- didChangeDependencies:State 對(duì)象的依賴(lài)關(guān)系發(fā)生變化后享郊,F(xiàn)lutter 會(huì)回調(diào)該方法览祖,隨后觸發(fā)組件構(gòu)建。State 對(duì)象依賴(lài)關(guān)系發(fā)生變化的典型場(chǎng)景:系統(tǒng)語(yǔ)言 Locale 或應(yīng)用主題改變時(shí)炊琉,系統(tǒng)會(huì)通知 State 執(zhí)行 didChangeDependencies 回調(diào)方法
- didUpdateWidget:Widget 的配置發(fā)生變化時(shí)展蒂,或熱重載時(shí),系統(tǒng)會(huì)回調(diào)該方法
一旦這三個(gè)方法被調(diào)用苔咪,F(xiàn)lutter 隨后便會(huì)銷(xiāo)毀舊的 Widget锰悼,并調(diào)用 build 方法重建 Widget
銷(xiāo)毀
組件銷(xiāo)毀相對(duì)創(chuàng)建和更新而言更簡(jiǎn)單。比如頁(yè)面銷(xiāo)毀時(shí)或是組件被移除時(shí)团赏,系統(tǒng)會(huì)調(diào)用 deactivate 和 dispose 這兩個(gè)方法箕般,來(lái)移除或銷(xiāo)毀組件
- 當(dāng)組件的可見(jiàn)狀態(tài)發(fā)生變化時(shí),deactivate 方法會(huì)被調(diào)用馆里,這時(shí) State 會(huì)被暫時(shí)從視圖樹(shù)中移除隘世。
注意:頁(yè)面切換時(shí),由于 State 對(duì)象在視圖樹(shù)中的位置發(fā)生了變化鸠踪,需要先暫時(shí)移除后再重新添加丙者,重新觸發(fā)組件構(gòu)建,因此也會(huì)調(diào)用 deactivate 方法 - 當(dāng) State 被永久地從視圖樹(shù)中移除時(shí)营密,F(xiàn)lutter 會(huì)調(diào)用 dispose 方法械媒,而一旦 dispose 方法被調(diào)用,組件就要被銷(xiāo)毀了评汰,因此可以在 dispose 方法中進(jìn)行最終的資源釋放纷捞、移除監(jiān)聽(tīng)、清理環(huán)境等工作