- 每个widget对应一个element
- 如果widget继承的是RenderObject类型的父类才会有createRenderObject,从而创建RenderObject对象
- RenderObject是真正的渲染对象,widget只是一个壳子或叫组合控件也可看做是一个配置文件;widget变化很多很不稳定,所以flutter引擎是和RenderObject来对接的;
- Element是中间人,持有widget和RenderObject对象;处理关于生命里的一些方法;比如StatefulElement在构造方法里会调用createState方法,初始化state对象,在build方法会调用state.build(); 5.Widget-Element-RenderObject 三个对象其数据结构都是树
从RunApp开始
attachRootWidget调用attachToRenderTree
attachToRenderTree方法初始化了根widget的Element,然后调用其mount(),这个方法被mustCallSuper注解修饰, 子类必须调super的方法
无论是StatelessWidget还是StateFulWidget, 他们的element都是继承ComponentElement,在其mount()里调用_firstBuild->rebuild->performRebuild, performRebuild-> 分别调用build()和updateChild
updateChild调用inflateWidget的方法会判断是否首次创建还是更新;如果首次创建会调用createElement和mount方法;
如果是MultiChildRenderObjectWidget的mount,会遍历子节点widget,inflateWidget的方法会判断是否首次创建还是更新; 如此递归就一直执行到树的最后一个节点