在分析Flutter渲染逻辑时,往往逻辑绕来绕去,看起来吃力头疼。
在其他网站找到一张这样的流程图能过清晰明了的说明Flutter渲染流程
如上图:
- 当 RenderObject 需要重新 layout 时,调用
markNeedsLayout
方法,该方法会将当前 RenderObject 加入PipelineOwner#_nodesNeedingLayout
或传给父节点去处理; - 当 RenderObject 的 Compositing Bits 有变化时,调用
markNeedsCompositingBitsUpdate
方法,该方法会将当前 RenderObject 加入PipelineOwner#_nodesNeedingCompositingBitsUpdate
或传给父节点去处理; - 当 RenderObject 需要重新 paint 时,调用
markNeedsPaint
方法,该方法会将当前 RenderObject 加入PipelineOwner#_nodesNeedingPaint
或传给父节点处理; - 当 RenderObject 的辅助信息(Semantics)有变化时,调用
markNeedsSemanticsUpdate
方法,该方法会将当前 RenderObject 加入PipelineOwner#_nodesNeedingSemantics
或传给父节点去处理
当页面需要渲染,包括组件位置,组件属性更改,相应就会调用到RenderObject对应方法,这也就是PipelineOwner 不断收集Dirty RenderObjects的过程,收集后都会调用requestVisualUpdate通知到底层引擎Flutter需要刷新,底层下一个Vsync信号就会从Window _handleBeginFrame
入口开始执行渲染流