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更新中非常关键的部分,从此也看出我们的页面是如何触发更新。