Flutter 開發知識
本文記錄一下,自己Flutter開發過程中的點點滴滴,如有錯誤,請諒解
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傳入的內容
https://juejin.im/post/5c7cd2f4e51d4537b05b0974
https://www.jianshu.com/u/74ca1c6607b6
執行緒和非同步
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
https://segmentfault.com/a/1190000008800122
https://www.didierboelens.com/2019/01/futures-isolates-event-loop
https://medium.com/dartlang/dart-asynchronous-programming-isolates-and-event-loops-bffc3e296a6
狀態管理
1 狀態管理的目的就是為了讓介面與業務分離,介面根據state來顯示
2 下圖是一個多頁面共享,維護困難,邏輯混亂的頁面狀態
3 StatefulWidget Flutter預設的狀態管理
4 InheritedWidget
主要作用在widget樹種傳遞資訊
5 Provider
Provider是基於觀察者模式, 狀態改變時要notifyListeners()
https://pub.dev/packages/provider
6 Scoped Model ,Bloc,Redux ,Flutter Redux,Rxdart等等
目前推薦是使用谷歌的provider
http://fluttersamples.com/
https://flutter.dev/docs/development/data-and-backend/state-mgmt
https://flutter.dev/docs/development/data-and-backend/state-mgmt/options
模式
1 Bloc
https://cloud.tencent.com/developer/article/1345645
2 MVVM
https://zhuanlan.zhihu.com/p/81520059
https://www.jianshu.com/p/384919408dda