Flutter源码分析系列(三):⾃定义控件(RenderBox)指南Flutter 源码分析系列(三):⾃定义控件(RenderBox)指南
Flutter 本⾝提供了⼤量Widget以供开发,但是难免有通过组合完成不了的效果,此时就需要我们⾃⼰来实现 RenderObject 了,本⽂会介绍⼀下实现⼀个 RenderObject 的基本步骤,帮助⼤家快速熟悉开发⾃定义控件的流程,当然这对于读懂原⽣ Widget 的实现源码也有很⼤的益处。
RenderObject 类继承层级解析
⾸先,介绍⼀下 RenderObject ⼦类的继承关系,通过 Android Studio 的 Hierarchy 功能可以直观地对类继承关系进⾏查看:
RenderObject 类继承关系
看过源码分析系列相关⽂章中对 runApp() ⽅法的解析后应该知道,RenderView 对应的是 RenderObject 树的根节点,打开该类的注释,发现有这样⼀句话:
The view has a unique child [RenderBox], which is required to fill the entire output surface.
意为 RenderView 根节点下只有唯⼀⼀个 RenderBox 作为叶节点,它的⼤⼩会充满整个绘制表⾯,由此可以看出,RenderBox 就是绘制上使⽤的基类了。继续观察⼀下 RenderObject 的⼦类继承树,发现有 3 个 Mixin 以及 RenderAbstractViewport 和 RenderSliver 没有继承⾃RenderBox,这些类都是⼲什么⽤的呢?这⾥简单介绍下:
flutter开发appRenderAbstractViewport 和 RenderSliver 主要处理滑动相关的控件展⽰,如 ListView 和 ScrollView。滑动相关的内容就不在本⽂中讲了,⼤家可以期待后续的⽂章。DebugOverflowIndicatorMixin ⽤于在 debug 下提⽰绘制是否溢出,该类仅⽤于 debug,⾃定义控件时⼀般⽤不到。
剩下的两个 mixin 还是⽐较关键的:
RenderObjectWithChildMixin ⽤于为只有 1 个 child 的 RenderObject 提供 child 管理模型。
ContainerRenderObjectMixin ⽤于为有多个 child 的 RenderObject 提供 child 管理模型。
这两个 mixin 是⾮常常⽤的,看⼀下 Hierarchy 可以发现基本上每个 RenderBox 都混⼊了他们,省去了⾃⼰管理 child 的代码。
除此之外还有⼀个类也有相当多的⼦类:RenderProxyBox,接下来就分别详细介绍⼀下继承 RenderBox 和 RenderProxyBox 实现⾃定义控件的正确姿势。
RenderBox
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论