## Widget多線程
在flutter
中,every is widget
,理解起來很容易,咱們所使用的顯示文字的Text
,展現圖片的Image
,展現位置信息的Padding
,都是Widget
.
在閱讀Flutter源碼的,你可能會注意到Widget
的定義:less
@immutable abstract class Widget extends DiagnosticableTree { ... const Widget({ this.key }); final Key key; static bool canUpdate(Widget oldWidget, Widget newWidget) { return oldWidget.runtimeType == newWidget.runtimeType && oldWidget.key == newWidget.key; } ... }
官方這樣講:異步
A widget is an immutable description of part of a user interface.
小部件是對用戶界面的不可變的描述。ide
咱們注意到左上角有@immutable
,這個很重要,窗口小部件中的全部屬性都必須爲final
,一旦實例化,就沒法跟更改內部屬性,可是事實上,咱們的UI
不可能一成不變的,所以Flutter
如何管理UI
的狀態呢? 佈局
Flutter
有三棵樹,Widget
樹、Element
樹、RenderObjects
樹,這些樹分工不一樣,將他們組合在一塊兒,來優化UI的各類可能性。post
記錄一個Widget的位置信息性能
An instantiation of a [Widget] at a particular location in the tree.
它是樹的可變部分,用於管理UI
更新和更改,您能夠將它看作是管理widget
的生命週期的元素。每一個元素都引用了一個widget
,很簡單的。優化
在Flutter
繪製UI時,它不會查看Widget
的樹,而是查看RenderObjects
,它控制大小,佈局並保留用於繪製實際widget
的全部邏輯,這就是渲染對象實例化很好性能的緣由。ui
爲了更好的展現這三棵樹,咱們看下面小部件:this
class HomeRoute extends StatelessWidget { @override Widget build(BuildContext context) { return Center( child: Text('Hello world'), ); } }
當咱們啓動應用時
1.Flutter
將遍歷您的窗口小部件並建立窗口小部件樹。
Flutter
建立元素樹,在其中經過createElement()
建立每個Element
對象。Element
調用createRenderObject()
時,將建立每一個渲染對象。如圖所示:
當咱們要改變小部件Text
的值,咱們看下Flutter Inspector
的信息。
更改前:
更改後:
在text
中顯示的值從4
變爲5
,它的renderObject
並未改變。
由於在實例化渲染對象很耗費性能,flutter
在這點作了保留,省掉了重複實例化的開銷,若是他們具備相同的類型,則無需從新建立渲染對象。咱們只須要更新key
的值,能夠作到從新建立渲染對象。
在實際開發中,一個頁面估計至少幾十個widget
,或者上百個widget
,那麼對應的element
和renderObject
也是數量相等的,所以從新建立整個樹是很是消耗性能的,flutter最大程度減少性能浪費,從而得到更佳的UI
性能。
<<Dart 異步與多線程>><<Flutter 詳解(1、深刻了解狀態管理--ScopeModel)>>
<<Flutter 詳解(2、深刻了解狀態管理--Redux)>>
<<Flutter 詳解(3、深刻了解狀態管理--Provider)>>
<<Flutter 詳解(4、深刻了解狀態管理--BLoC)>>