flutter Widget和Element

widget
element
  1. 图中忽略了很多函数
  2. 图中并没有包含子类对父类override

简单总结:

  1. RenderObjectWidget与最终的渲染对象一一对应,内部包含了创建和更新RenderObject的函数。
  2. StatelessWidgetStatefulWidget与渲染无关,可以理解为逻辑上的Widget,或者是RenderObjectWidget容器,在build()state.build()函数中最后还是要返回RenderObjectWidget
  3. 可以看到Element中包含非常多的函数,比如update()mount()inflateWidget()等等,Element组成树的结构管理着整个应用的渲染信息。
    以热更新为例,整个过程都是在遍历(BuildOwner.buildScope()内部)_dirtyElements数组,然后调用Element.rebuild()->Element.performRebuild,如果是ComponentElement,在performRebuild()中就会通过build()函数获取下一层的Widget,通过判断其本身以及runtimeTypekey决定复用旧的还是重新创建新的Element,复用分两种,一种是直接使用_child,另外则是通过_retakeInactiveElement(key, newWidget);获得,然后将Widget赋值给决策后的Element
    新创建的Element如果是ComponentElement,在mount过程中会运行_firstBuild(),如果是RenderObjectElement,在mount过程中会运行createRenderObject()
    如果遍历到RenderObjectElement,依然调用Element.rebuild()->Element.performRebuild,在其performRebuild()中调用updateRenderObject

Elementbuild()函数就是Widgetbuild()函数

  1. 可以看到,RenderObject只和RenderObjectWidgetRenderObjectElement一一对应。数量远远少于WidgetElement

/>> 标题写的太大,之后如果有相关内容会修改。

你可能感兴趣的:(flutter Widget和Element)