Flutter速来系列9: 布局类的伟大航线的开始,始于3个ObjectWidget

262 阅读2分钟

一、几乎所有布局源自他们三

其实如果这是为了快速上手,直接忽略这些即可

是的。Flutter有很多布局组件。

有的布局组件下,可以有多个子组件,有的只能有是一个子组件,有的是一个也没有。

但是,几乎所有布局组件,都继承自3个ObjectWidget。

分别是:

  • LeafRenderObjectWidget 没有任何子组件
  • SingleChildRenderObjectWidget 仅有一个 子组件
  • MultiChildRenderObjectWidget 允许有多个子组件

注意:我们这里是大多数布局组件继承这三个,而不是说所有widget,也不是说所有组件


基类组件描述子组件支持
LeafRenderObjectWidget用于创建只有一个渲染对象的非容器类组件基类。通过重写 createRenderObject 方法,创建自定义的渲染对象,并将其添加到渲染树中。不支持子组件
SingleChildRenderObjectWidget用于创建只有一个子渲染对象的容器类组件基类。通过重写 createRenderObject 方法创建自定义的渲染对象,并将子组件传递给渲染对象。支持一个子组件
MultiChildRenderObjectWidget用于创建具有多个子渲染对象的容器类组件基类。通过重写 createRenderObject 方法创建自定义的渲染对象,并使用 visitChildren 方法访问子组件。支持多个子组件

什么什么?模糊?

来例子呗 以下是一些常见的 Flutter 组件以及它们的继承关系:

  1. Container 组件:

    • 继承自:StatelessWidget
  2. Row 组件:

    • 继承自:Flex
    • Flex 继承自:FlexParentDataWidget<FlexParentData>
    • FlexParentDataWidget 继承自:ParentDataWidget<ParentData>
  3. Column 组件:

    • 继承自:Flex
    • Flex 继承自:FlexParentDataWidget<FlexParentData>
    • FlexParentDataWidget 继承自:ParentDataWidget<ParentData>
  4. Stack 组件:

    • 继承自:MultiChildRenderObjectWidget
  5. Expanded 组件:

    • 继承自:ParentDataWidget<MultiChildLayoutParentData>
  6. SizedBox 组件:

    • 继承自:SingleChildRenderObjectWidget
  7. SingleChildScrollView 组件:

    • 继承自:SingleChildRenderObjectWidget
  8. ListView 组件:

    • 继承自:BoxScrollView
    • BoxScrollView 继承自:ScrollView
    • ScrollView 继承自:SingleChildRenderObjectWidget
  9. GridView 组件:

    • 继承自:BoxScrollView
    • BoxScrollView 继承自:ScrollView
    • ScrollView 继承自:SingleChildRenderObjectWidget

够不够了然?

好的。

过,