1. Element 、Widget 、 RenderObjectWidget
abstract class Element
void mount(Element? parent, Object? newSlot) {}
抽象类Element 有mount方法
abstract class Widget
Element createElement()
抽象类Widget 有createElement方法
abstract class RenderObjectWidget extends Widget
RenderObject createRenderObject(BuildContext context)
RenderObjectWidget有createElement方法 和 createRenderObject方法
2.Widget树、Element树、Render树
每一个Widget, 都有createElement方法,通过createElement方法 创建一个Element对象,
Element加入Element树中,它会创建三种Element ,每个Element 有个mount方法
第一种:RenderObjectElement(RenderObjectWidget的createElement方法)
mount方法中 调用
widget.createRenderObject(this) ,创建RenderObject对象,RenderObject对象加入Render树中
RenderObjectWidget ->createElement()->RenderObjectElement->mount()->RenderObjectWidget.createRenderObject(this) ->RenderObject对象
第二种:StatefulElement继承ComponentElement
StatefulWidget->createElement()->StatefulElement
StatefulElement 构造方法中
用createState方法,创建State
将Element赋值给state
将Widget赋值给state
-> ComponentElement mount()方法中
调用_firstBuild()->rebuild()->performRebuild()->build()
state.build(this), 用state的build方法 并且将自己(Element)传出去
第三种:StatelessElement继承ComponentElement
StatelessWidget->createElement()->StatefulElement->ComponentElement mount()方法中
调用_firstBuild()->rebuild()->performRebuild()->build()
state.build(this), 用state的build方法 并且将自己(Element)传出去
并不是所有的Widget都会被独立渲染!只有继承RenderObjectWidget的才会创建RenderObject对象!