4.1 布局简介
布局类组件都会包含一个或者多个子组件,不同的布局类组件对子组件的排列方式不同,排版最终会通过Element
树才是最终的绘制树,Element
是通过Widget.createElement
创建的,Widget
是Element
的配置数据,在Flutter
中,根据Widget
是否需要包含子节点将Widget
分为三类,如下:
Widget | Element | 用途 |
---|---|---|
LeafRenderObjectWidget | LeafRenderObjectElement | Widget的叶子节点(叶子就是没有孩子的节点),一般用于基础组件如Image、 |
SingleChildRenderObjectWidget | SingleChildRenderObjectElement | 包含一个子组件,如:Container,Align... |
MultiChildRenderObjectWidget | MultiChildRenderObjectElement | 包含一个或多个子组件,如:Row,Column,Stack... |
b布局类组件就是指直接或者间接(包含)MutiChildRenderObjectWidget
的Widget,他们一般有child
属性用来接收子组件,Widget
>RenderObjectWidget
>(Leaf/SingleChild/MutiChild)RenderObjectWidget
RenderObjectWidget
类定义了创建、更新RenderObject
的方法,子类必须实现他们,关于RenderObject
我们现在只需要知道他是最终布局,渲染UI界面即可,也就是说,布局类算法都是通过RenderObject
对象来实现的,所以读者接下来对布局类组件原理感兴趣可以自行查看RenderObject
的实现。