Flutter的生命周期執行時機可以分為兩個主要部分:Flutter本身的組件生命周期(widget生命周期)和平臺相關的應用程序生命周期(APP生命周期)。
Widget生命周期
Widget生命周期可以細分為三個階段:
-
初始化階段:
在這個階段,Flutter會執行構造方法和initState
。initState
是widget創建執行的第一個方法,只會調用一次,可以在這里進行一些初始化工作,如初始化State的變量。 -
狀態變化階段:
當需要創建新的widget或者調用setState
方法時,Flutter會進入狀態變化階段。setState
方法用于通知Flutter框架該組件的狀態發生了變化,并觸發組件的重新構建。 -
銷毀階段:
當widget從渲染樹中被移除時,會依次執行deactivate
和dispose
方法。deactivate
方法在widget被移除之前調用(隱式,未暴露給開發者,不能直接覆蓋這個方法),而dispose
方法在State對象從樹中被永久移除時調用,通常在此回調中釋放資源。
另外,還有一個reassemble
方法,它在熱重載(hot reload)時會被調用,但在Release模式下永遠不會被調用。
APP生命周期
APP生命周期主要通過WidgetsBindingObserver
的didChangeAppLifecycleState
方法來獲取。這個方法會在應用程序的生命周期狀態發生變化時調用,例如應用程序進入前臺或后臺。
入口點
Flutter應用程序的入口點是main()
函數。在這個函數中,Flutter框架會被初始化,并調用runApp()
函數來啟動應用程序。runApp()
函數會創建一個實例(通常是WidgetsApp
或MaterialApp
),并將其渲染到設備的屏幕上。當應用程序啟動時,會觸發相應的生命周期回調方法。
StatelessWidget
值得注意的是,StatelessWidget
是一種無狀態的Widget,在Flutter中沒有顯式的生命周期方法。它的生命周期只有一個build
過程,每次在頁面刷新時都會調用build
方法來創建widget。小部件的依賴關系發生變化(例如,此小部件引用的 InheritedWidget 更改)時,框架也會調用此方法。
StatefulWidget
-
initState():
- 當State對象被創建并關聯到StatefulWidget后立即調用。
- 在這個方法中,你可以進行一次性初始化操作,如設置監聽器、初始化異步任務等。但請注意,此時不能直接訪問
BuildContext
,因為widget尚未被構建到樹中。
-
didChangeDependencies():
- 在
initState()
之后和首次build()
之前調用。 - 當依賴關系(如
InheritedWidget
)發生變化時也會調用。 - 在這個方法中,你可以處理依賴項變更,進行依賴數據的獲取或刷新。
- 在
-
build(BuildContext context):
- 與無狀態組件相同,每次需要重新構建widget樹時都會調用此方法。
- 這里根據
BuildContext
創建并返回widget樹。
-
didUpdateWidget(covariant T oldWidget):
- 當widget的配置發生變化(即StatefulWidget的
createState
方法返回的State對象沒有改變,但StatefulWidget本身或它的屬性發生了變化)時調用。 - 你可以在這里更新State對象的屬性以反映新的配置。
- 當widget的配置發生變化(即StatefulWidget的
-
dispose():
- 當State對象從樹中被永久移除時調用。
- 在這里,你應該釋放任何在
initState()
中使用的資源,如取消監聽器或停止動畫。
-
reassemble():
- 在熱重載(hot reload)時調用,但在Release模式下永遠不會被調用。
- 這在開發過程中可能很有用,例如,在熱重載時重置某些狀態。
-
setState(VoidCallback fn):
- 這不是一個生命周期方法,但它是State類的一個關鍵方法。當你需要更新State對象的屬性并重新構建UI時,你應該調用此方法。它接受一個回調函數,該回調函數應該修改State對象的狀態。
這些生命周期方法允許你在Flutter應用程序中更精細地控制組件的行為和生命周期。