BuildOwner
主要用来管理Element的状态:
- 在UI更新过程中、管理需要rebuild的Element
- 在有需要rebuild的Element时,通知引擎在下一帧对其rebuild
- 管理处于”inactive”状态的Element
BuildOwner从何而来
1 |
|
在Element类的mount
方法中可以看出,_owner
是从parent得到的。
而根元素的_owner
则是通过RootRenderObjectElement
的assignOwner
方法传入创建的BuildOwner
。
BuildOwner
的创建则是在WidgetsBinding
中,并赋值给Element Tree的根节点RenderObjectToWidgetElement
,此后逐级传递给子节点。
一般情况下并不需要我们手动实例化BuildOwner
BuildOwner解析
BuildOwner
有两个关键成员变量
1 | /// 存储 InactiveElements |
Dirty Element
dirty element,就是需要更新的Element
例如在StatefulElement
里,我们最常用的更新方法就是调用setState
1 |
|
setState
执行传入的函数,然后调用Element的markNeedsBuild
方法
1 | void markNeedsBuild() { |
markNeedsBuild
方法,将Element的_dirty
属性赋值为true
,调用BuildOwner
的scheduleBuildFor
方法,并传入本身。
1 | void scheduleBuildFor(Element element) { |
BuildOwner
将传入的Element放入_dirtyElements
中。
在绘制新的一帧时,WidgetsBinding.drawFrame
会调用BuildOwner.buildScope
方法
1 | void buildScope(Element context, [ VoidCallback callback ]) { |
Inactive Elements
是指Element从Element Tree上被移除到dispose之间,或者被重新插入之间的中间状态。
设计inactive状态的主要目的是实现带有global key
的Element可以带着状态在树上任意移动
小结
BuildOwner
主要用于收集需要rebuild的Element和inactive状态的Element。
在Element更新中非常关键的部分,从此也看出我们的页面是如何触发更新。