Flutter的組件渲染方式參考了RN的渲染方式,經過虛擬Dom和diff計算來達到性能的優化。在Flutter中左右的東西都是有Widget組成,這裏咱們不討論簡單的StalessWidgtet,由於其使用和渲染都很簡單,主要以有實際意義的StafulWidget爲探討對象。與RN的渲染同樣,能夠將Flutter組件渲染分紅三個階段less
初始化的時候會依次調用initState->didChangedDependencies->build方法。函數
initState是在構造函數以後調用的,整個組件的生命週期階段只會調用一次,值得注意的是在咱們更新組件的時候,組件是會從新建立的,但State在銷燬以前一直都是同一個,而且從新綁定到新的組件上,在裏面咱們能夠初始化一些全局要用到的東西。性能
didChangedDependencies方法會在initState後調用,在這方法回調裏,咱們可使用InheritedWidget獲取父級傳遞共享的資源。整個生命週期didChangedDependencies會調用屢次,至少1次,而且在某些更新階段也會調用。優化
更新分爲兩種更新:ui
一種是組件自己或者其父組件調用setState觸發的更新,這種更新走的生命週期是:didUpdateWidget->build。對象
這沒什麼說的,咱們能夠在didUpdateWidget從新綁定一些組件的監聽或者重置狀態。生命週期
另外一種是依賴的InheritedWidget發生變化的時候,會觸發didChangedDependencies。ci
銷燬階段,主要執行的方法有兩個:deactivate->dispose。資源
deactivate方法標誌組件爲無效狀態,緊跟着會進入dispose,開發
dispose是組件徹底銷燬時回調,主要在裏面作一些移除監聽的操做
簡單瞭解生命週期還不夠,要知道咱們有多個頁面時生命週期是如何運做的這對咱們開發來很重要。
假設有兩個頁面A、B,當咱們新打開頁面時,初始化階段很簡單
A:initState -> didChangedDependences ->build
這時候,咱們開啓新的B頁面:
B:initState -> didChangedDependences ->build
A:deactivate->build
你沒有看錯,咱們B頁面初始化階段結束後,A頁面會進入不可用狀態,並從新build(但不會繪製),A頁面不會卸載。
最後,咱們從B頁面按返回鍵返回A頁面:
A:deactivate->build
B:deactivate->dispose
此時A頁面進入運行狀態,B頁面移除