短视频app开发,当有UI需要更新时如何触发渲染?
短视频app开发,当有UI需要更新时如何触发渲染?
接下来我们先分析一下当有UI需要更新的时候,是怎么样触发渲染,从应用到Framework,再到Engine这个过程是怎么样的。在Flutter开发应用的时候,当需要更新的UI的时候,需要调用一下setState方法,然后就可以实现了UI的更新,我们接下来分析一下该方法做哪些事情。
void _drawFrame() { //Engine回调Framework入口
_invoke(window.onDrawFrame, window._onDrawFrameZone);
}
//初始化的时候把onDrawFrame设置为_handleDrawFrame
void initInstances() {
super.initInstances();
_instance = this;
ui.window.onBeginFrame = _handleBeginFrame;
ui.window.onDrawFrame = _handleDrawFrame;
SystemChannels.lifecycle.setMessageHandler(_handleLifecycleMessage);
}
void _handleDrawFrame() {
if (_ignoreNextEngineDrawFrame) {
_ignoreNextEngineDrawFrame = false;
return;
}
handleDrawFrame();
}
void handleDrawFrame() {
_schedulerPhase = SchedulerPhase.persistentCallbacks;//记录当前更新UI的状态
for (FrameCallback callback in _persistentCallbacks)
_invokeFrameCallback(callback, _currentFrameTimeStamp);
}
}
void initInstances() {
....
addPersistentFrameCallback(_handlePersistentFrameCallback);
}
void _handlePersistentFrameCallback(Duration timeStamp) {
drawFrame();
}
void drawFrame() {
...
if (renderViewElement != null)
buildOwner.buildScope(renderViewElement); //先重新build widget
super.drawFrame();
buildOwner.finalizeTree();
}
void drawFrame() { //这个方法完成Layout,CompositingBits,Paint,生成Layer和提交给Engine的工作
assert(renderView != null);
pipelineOwner.flushLayout();
pipelineOwner.flushCompositingBits();
pipelineOwner.flushPaint();
renderView.compositeFrame(); //生成Layer并提交给Engine
pipelineOwner.flushSemantics();
}
从上面代码分析得知,从Engine回调,Framework会build,Layout,Paint,生成Layer等环节。
以上就是短视频app开发,当有UI需要更新时如何触发渲染?, 更多内容欢迎关注之后的文章
浙公网安备 33010602011771号