1. 生命週期相關邏輯
1.1 什麼是生命週期
- 系統封裝好的回撥方法
- 開發者知道當前widget處於什麼狀態
1.2 生命週期作用
- 監聽狀態
- 在指定的時機初始化狀態與資料
- 記憶體管理相關邏輯
2. widget生命週期
2.1 Stateless
- widget的構造方法
- widget的build方法
2.2 Statefull
- widget的構造方法
- widget中呼叫_state的構造方法
- state的init方法
- state的didChangeDependencies方法,此方法依賴InheritedWidget發生變化之後,也會呼叫。
- state的build方法,呼叫setState方法時,會呼叫build方法
- state的deactivate方法,在dispose方法之前呼叫
- 當銷燬widget的時候呼叫dispose方法
3. widget渲染邏輯
3.1 widget子類
widget子類有StatefulWidget、StatelessWidget和RenderObjectWidget。前兩個我們用的比較多。而RenderObjectWidget不會直接使用,但是有幾個它的子類我們會經常用到。
3.2 RenderObjectWidget
繼承於RenderObjectWidget的類,會加入到render tree中。Row和Colum間接的繼承於RenderObjectWidget。
我們來看看詳細的繼承關係:
Row和Colum都是繼承Flex,而Flex繼承MultiChildRenderObjectWidget,MultiChildRenderObjectWidget繼承RenderObjectWidget。
注意:並不是所有的Widget都會被獨立渲染!只有繼承RenderObjectWidget的才會建立RenderObject物件!
3.3 Flutter中的三棵樹
Widget樹、Element樹和Render樹 通過Android Studio視窗右邊的‘Flutter Inspector’可以看到Widget樹和Render樹,如圖:

3.4Element樹作用
在framework.dart中,檢視StatelessWidget和StatefulWidget宣告文件中,都會有一個createElement()方法,
StatelessWidget如圖:


而element樹中的結點和widget樹的結點是一一對應的,如果widget中某個結點變動了,element也只改動相應的結點,渲染時只需要渲染變動的結點即可。
3.5 渲染邏輯
3.5.1 StatefullWidget渲染邏輯
StatefullWidget繼承與Widget,系統會隱式呼叫createElement方法和mount方法。
createElement方法實現只有一行程式碼,呼叫StatefulElement構造方法,引數是this,也就是StatefullWidget。如圖:









簡單總結一下StatefullWidget的渲染流程:
StatefullWidget會建立StatefulElement
- StatefulElement繼承CompentElement
- 呼叫createState方法,建立State
- 將widget賦值給State
- 呼叫state的build方法,並且將自己(Element)傳出去
- build裡的context就是Widget的Element
3.5.2 StatelessWidget渲染邏輯
StatelessWidget相對簡單很多:
StatelessWidget會建立StatelessElement
- StatelessElement繼承CompentElement
- 主要就是呼叫build方法,並且將自己(Element)傳出去
3.5.3 RenderObjectWidget渲染邏輯
通過row或者colum的父類可以找到RenderObjectWidget,
RenderObjectWidget會建立RenderElement
- RenderElement建立RenderObject
- Flutter會呼叫mount方法
- 呼叫createRanderObject方法