Widget 生命周期
- 一切皆widget
- StatelessWidget狀態不可變,通常用於那些狀態不變的控件
無狀態的widget的生命周期方只有 createElement 和 build兩個生命周期方法
注意:並不是寫了之后,就徹底無法改變, 通過狀態管理框架,依舊可使StatelessWidget發生改變 - StatefulWidget狀態,多個生命周期函數參與回調
初始化時期 createState 和 initState
更新時期 didChangeDependencies 、build 、didUpdateWidget
銷毀時期 deactivate 和 dispose
- initState 創建之初調用一次 類似於onCreate
- didChangeDependencies 在initState之后調用,可以在這個方法中跨組件拿到數據
- build 創建Widget的地方,在離開和回到頁面的時候都會調用
- didUpdateWidget 當組件的狀態改變的時候就會調用,比如調用-了setState
- deactivate 在離開和回到頁面的時候都會調用
- dispose 銷毀的時候調用
三棵樹 (Widget Element RenderObject)
Flutter 的渲染流程
runApp(rootWidget),將rootWidget傳給rootElement,做為rootElement的子節點,生成Element樹,由Element樹生成Render樹
Widget:存放渲染內容、視圖布局信息,widget的屬性
Element:存放上下文,通過Element遍歷視圖樹,Element同時持有Widget和RenderObject
RenderObject:根據Widget的布局屬性進行layout,paint Widget傳入的內容
線程和異步
Dart是單線程模型,沒有線程的概念,只有isolate,每個isolate都是隔離的,並不會共享內存。
而一個Dart程序是在Main isolate的main函數開始 而在Main函數結束后,Main isolate線程開始一個一個(one by on e)的開始處理Event Queue中的每一個Event
Dart事件循環機制是由一個 消息循環(Event looper) 和兩個消息隊列:事件隊列(Event queue) 和 微任務隊列(Micro Task queue) 構成
消息循環的處理機制為
1是否有微任務隊列,如果有微任務,處理微任務,走2。如果沒有微任務,走3
2 微任務處理完成后,回來走1
3 是否有事件隊列,如果有事件隊列,處理事件,走4。如果沒有事件,走5
4 事件處理完成之后,回來走1
5 程序正常exit
參來源