Flutter布局浅谈

152 阅读2分钟

一.Flutter布局模型

Flutter中有两种布局模型:

  1. 基于RenderBox的盒模型布局
  2. 基于Sliver(RenderSliver)按需加载列表布局

两种布局模型大体规则相同,布局时应记住以下:

  • 上层Widget向下层Widget传递约束条件
  • 下层Widget向上层Widget传递大小信息(确定自己的大小,然后告诉上层Widget,注意下层Widget的大小必须符合上层Widget的约束)
  • 上层Widget决定下层Widget的位置

1,基于RenderBox的盒模型布局有两个特点:

1),组件(或Widget)对应的渲染对象都继承自RenderBox

2),在布局过程中上层Widget传递给下层Widget的约束信息由BoxConstraints描述

常见组件有:ConstrainedBox,SizedBox,UnconstrainedBox,AspectRatio等等

2,基于Sliver(RenderSliver)按需加载列表布局

Sliver:中文理解为"薄片",只有当Sliver出现在视口中时才会去构建它,这种模型也称为“基于Sliver的列表按需加载模型”。如ListView,GridView等。 可以包含一个或多个子组件,主要作用是: 加载子组件并确定每一个子组件的布局和绘制信息,如果Sliver可以包含多个子组件时,通常会实现按需加载模型

image.png

二.Flutter布局细分

  1. 线性布局:沿着水平或者垂直方向排列子组件,如RowColumn,有主轴和纵轴之分

  2. 弹性布局:允许子组件按照一定比例来分配父组件的空间。主要通过FlexExpanded来实现

  • RowColumn继承自Flex
  • Expanded只能作为Flex的孩子,否则会报错
  1. 流式布局:Row默认只有一行,如果超出屏幕不会折行。我们把超出屏幕显示范围会自动折行的布局称为流式布局,主要通过WrapFlow(很少用)实现

  2. 层叠布局:层叠布局和 Web 中的绝对定位类似,子组件可以根据距父容器四个角的位置来确定自身的位置。层叠布局允许子组件按照顺序堆叠起来。Flutter中使用StackPositioned配合实现绝对定位。Stack允许子组件堆叠,而Positioned用于根据Stack的四个角来确定子组件的位置。

  3. Align相对定位Align组件的特性和Web开发中相对定位(position: relative)相似

  4. 网格和列表布局GridViewListView

三.自适应和响应式布局

image.png

摘自官方文档,两者区别本人理解仍不是很清晰😶

image.png

参考文档:

1,flutter.cn/docs/develo…

2,book.flutterchina.club/chapter4/in…