在原生 Android 读存、原生 iOS 微姊、前端 React 或者 Vue 都存在生命周期的概念,在 Flutter 中一樣存在生命周期的概念烫映,其基本概念和作用相似沼本。
StatelessWidget 用于不需要維護(hù)狀態(tài)的場景,只會渲染一次锭沟,沒有其他生命周期函數(shù)抽兆,因此在執(zhí)行速度和效率方面比 StatefulWidget 更好。
重點(diǎn)看下 StatefulWidget 中的生命周期族淮。
createState:該函數(shù)為 StatefulWidget 中創(chuàng)建 State 的方法辫红,當(dāng) StatefulWidget 被調(diào)用時(shí)會立即執(zhí)行 createState 凭涂。
initState:該函數(shù)為 State 初始化調(diào)用,對于每一個(gè) State 對象贴妻,只會調(diào)用一次該回調(diào)切油。因此通常在該回調(diào)中做一些一次性的操作,如在此期間執(zhí)行 State 各變量的初始賦值名惩,同時(shí)也可以在此期間與服務(wù)端交互白翻,獲取服務(wù)端數(shù)據(jù)后調(diào)用 setState 來設(shè)置 State。
didChangeDependencies:該函數(shù)在 State 對象的依賴發(fā)生變化時(shí)會被調(diào)用绢片。(這個(gè)“依賴”指的就是子 widget 是否使用了父 widget 中 InheritedWidget 的數(shù)據(jù)滤馍,典型的場景是,例如系統(tǒng)語言或者應(yīng)用主題的改變)
build:主要是返回需要渲染的 Widget 底循,由于 build 會被調(diào)用多次巢株,因此在該函數(shù)中只能做返回 Widget 相關(guān)邏輯,避免因?yàn)閳?zhí)行多次導(dǎo)致狀態(tài)異常熙涤。
reassemble:該函數(shù)主要是提供開發(fā)階段使用阁苞,在 debug 模式下,每次熱重載都會調(diào)用該函數(shù)祠挫,因此在 debug 階段可以在此期間增加一些 debug 代碼那槽,來檢查代碼問題。(正式環(huán)境下永遠(yuǎn)不會被調(diào)用)
didUpdateWidget :該函數(shù)主要是在 widget 重新構(gòu)建等舔,比如說熱重載骚灸,父組件發(fā)生 build 的情況下。
Flutter framework 會調(diào)用 Widget.canUpdate 來檢測 Widget 樹中同一位置的新舊節(jié)點(diǎn)慌植,然后決定是否需要更新甚牲。(當(dāng)新舊 widget 的 key 和 runtimeType 同時(shí)相等時(shí)會返回 true,則會調(diào)用 didUpdateWidget() 該函數(shù))deactivate:當(dāng) State 對象從樹中被移除后會被調(diào)用蝶柿,如果該 widget 被移除節(jié)點(diǎn)丈钙,然后未被插入到其他節(jié)點(diǎn)時(shí),則會繼續(xù)調(diào)用 dispose 永久移除交汤。
dispose:當(dāng) State 對象從樹中被永久移除時(shí)調(diào)用雏赦,并釋放資源。