「这是我参加2022初次更文应战的第3天,活动概况查看:2022初次更文应战」
咱们在上一篇文章中剖析了一下Flutter
的三棵树:Widget树
、Element树
和RenderObject树
;这次咱们来剖析一下,有状况和无状况Widget
中的Element
有什么区别?
StatelessWidget的Element
咱们首先看一下在StatelessWidget
中element
的创立办法:
在StatelessWidget
中经过createElement()
办法创立了一个StatelessElement
目标,而StatelessElement
承继自ComponentElement
,那么咱们剖析一下ComponentElement
发现,在ComponentElement
中有mount
办法,咱们在之前的文章中现已剖析得知,Widget
创立Element
之后会在Element
中调用mount
办法,那么咱们来剖析一下此刻的mount
办法中做了什么事情:
在mount
办法中,调用了_firstBuild()
办法:
在_firstBuild()
办法中去调用了rebuild()
办法:
之后,咱们在rebuild()
办法中会看到一个很重要的办法performRebuild()
办法,继续往下走咱们会发现只能看到performRebuild()
办法的定义:
因为此刻咱们现已进入了Element
类内部,所以咱们可以猜测到performRebuild()
的完成应该在Element
的子类中,终究咱们在ComponentElement
类中找到了performRebuild()
办法的完成:
在performRebuild()
办法中调用了build()
,在ComponentElement
类中build()
办法也只要定义没有完成,那么咱们只能再去ComponentElement
的子类中寻觅build
办法的完成,很明显build
的完成应该在StatelessElement
中:
在StatelessElement
中build
的完成为widget.build(this)
,咱们经过Debug
断点履行可以看到:
-
widget
:为MyApp
; -
this
:为当时StatelessElement
目标;
也便是说,此刻是MyApp
在调用build
办法并传递了一个参数StatelessElement
,咱们看一下MyApp
的完成:
这便是MyApp
的build
被调用,然后烘托的流程;同时也可以得到BuildContext
其实也便是Element
(咱们在之前的文章中运用StatefulElement
也做过如下的操作):
简略来说,
StatelessWidget
初始化时会经过createElement()
办法创立一个StatelessElement
,在createElement()
办法中会调用mount
办法,在mount
办法中会调用Widget
的build
办法进行烘托并将Element自己
传递出去;
StatefulWidget的Element
StatefulWidget
与StatelessWidget
稍有不同,在StatefulWidget
中比StatelessWidget
多了一个createState
办法:
咱们先看一下createElement()
办法创立StatefulElement
的完成:
在StatefulElement
的构造办法中,直接调用了widget.createState()
来创立state
目标,同时会将widget
目标保存到state._widget
中(这也是咱们在State中可以经过widget来访问Widget中定义的特点的原因
),把Element目标
保存到state._element
中(Widget自身与State目标共用同一个Element
);
终究经过state
目标来调用build
办法:
总结
-
Flutter
中存在三棵树:Widget树
、Element树
和Render树
;Flutter
引擎针对Render树
中的目标烘托;并非每一个Widget
都有Render树
; - 每一个
Widget
创立时,都会创立一个Element
目标;- 经过
createElement()
办法创立Element
目标,并将Element
目标加入到Element树
中,都会调用mount
办法; -
RenderElement
首要是创立RenderObject
- 经过
mount
办法创立RenderObject
目标;
- 经过
-
StatefulElement
承继ComponentElement
- 调用
createState()
办法,创立state
目标; - 将
Widget
赋值给state
目标的_widget
特点; - 经过
state
的build
办法将自己也便是Element
传出去;
- 调用
-
StatelessElement
承继ComponentElement
- 首要调用
build
办法将Element
传递出去;
- 首要调用
- 经过