widget
element
- 图中忽略了很多函数
- 图中并没有包含子类对父类
override
简单总结:
-
RenderObjectWidget与最终的渲染对象一一对应,内部包含了创建和更新RenderObject的函数。 -
StatelessWidget和StatefulWidget与渲染无关,可以理解为逻辑上的Widget,或者是RenderObjectWidget的容器,在build()和state.build()函数中最后还是要返回RenderObjectWidget。 - 可以看到
Element中包含非常多的函数,比如update()、mount()、inflateWidget()等等,Element组成树的结构管理着整个应用的渲染信息。
以热更新为例,整个过程都是在遍历(BuildOwner.buildScope()内部)_dirtyElements数组,然后调用Element.rebuild()->Element.performRebuild,如果是ComponentElement,在performRebuild()中就会通过build()函数获取下一层的Widget,通过判断其本身以及runtimeType和key决定复用旧的还是重新创建新的Element,复用分两种,一种是直接使用_child,另外则是通过_retakeInactiveElement(key, newWidget);获得,然后将Widget赋值给决策后的Element。
新创建的Element如果是ComponentElement,在mount过程中会运行_firstBuild(),如果是RenderObjectElement,在mount过程中会运行createRenderObject()。
如果遍历到RenderObjectElement,依然调用Element.rebuild()->Element.performRebuild,在其performRebuild()中调用updateRenderObject。
Element的build()函数就是Widget的build()函数
- 可以看到,
RenderObject只和RenderObjectWidget、RenderObjectElement一一对应。数量远远少于Widget和Element。
/>> 标题写的太大,之后如果有相关内容会修改。












网友评论