1. 前言
有时候,RenderObject需要在其子节点中存储一些数据,比如用于布局的一些参数,或者和其他子节点之间的关系。为此,Flutter提供了ParentData,用于存储父节点的一些信息。每个RenderObject都有这个成员变量,该成员在setupParentData方法中初始化。子类如果需要ParentData的某个子类,需要重写该方法,并在该方法中对ParentData进行初始化。
2. ParentData分类
ParentData可以分为三大类:BoxParentData,SliverLogicalParentData,以及SliverPhysicalParentData。其中SliverLogicalParentData和SliverPhysicalParentData用于sliver,对应滑动视图场景,此文不进行展开。BoxParentData则用于RenderBox,对应普通视图场景,是本文讲解的重点。
BoxParentData中主要属性是offset,用于描述子节点在父节点中的坐标偏移,主要用于子节点的布局,其源码如下:
class BoxParentData extends ParentData {
/// The offset at which to paint the child in the parent's coordinate system.
Offset offset = Offset.zero;
@override
String toString() => 'offset=$offset';
}
BoxParentData的子类TableCellParentData主要用于表格布局,_ToolbarParentData主要用于iOS风格的工具栏布局,ContainerBoxParentData主要用于需要ContainerRenderObjectMixin的节点布局。
其中,ContainerBoxParentData使用频率很高,基本上所有父节点ParentData都混入了该类,该类需要与ContainerRenderObjectMixin共同使用,主要解决了对child的管理,它用双链表存储了所有子节点并提供了方便的接口去获取他们。对于开发者,一般来说只用到Containe