WidgetsBinding
它是widget层与Flutter引擎的粘合剂,管理着以[rootElement
]为根的单一[Element
]树, 调用 [runApp
](间接调用 [attachRootWidget
])会创建该[rootElement
]。
在WidgetsBinding
中有一个重要的字段BuildOwner
,它负责widget层的构建和更新,在此binding中初始化且设置onBuildScheduled
回调。
所有widget的BuidlerOwner
都是此_buildOwner
,在创建rootElement
时赋值给根节点,然后通过根节点传递下去(element执行mount的时候,_owner = parent.owner,_parentBuildScope = parent.buildScope),一同传递下去的还有BuildScope
。
js
void initInstances() {
super.initInstances();
_instance = this;
_buildOwner = BuildOwner();
buildOwner!.onBuildScheduled = _handleBuildScheduled;
......
}
void _handleBuildScheduled() {
ensureVisualUpdate();
}
void attachToBuildOwner(RootWidget widget) {
final bool isBootstrapFrame = rootElement == null;
_readyToProduceFrames = true;
_rootElement = widget.attach(buildOwner!, rootElement as RootElement?);
if (isBootstrapFrame) {
SchedulerBinding.instance.ensureVisualUpdate();
}
}
BuidlerOwner
记录所有被标记的脏元素列表,在下一帧执行drawFrame时,调用buildOwner.buildScope方法时重新build
element元素。
super.drawFrame();
会调用RendererBinding
的drawFrame
去启动PipelineOwner
重新绘制UI。
js
@override
void drawFrame() {
TimingsCallback? firstFrameCallback;
......
try {
if (rootElement != null) {
buildOwner!.buildScope(rootElement!);
}
super.drawFrame();
buildOwner!.finalizeTree();
} finally {
assert(() {
debugBuildingDirtyElements = false;
return true;
}());
}
}