一.Flutter布局模型
Flutter中有两种布局模型:
- 基于RenderBox的盒模型布局
- 基于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
可以包含多个子组件时,通常会实现按需加载模型
二.Flutter布局细分
-
线性布局:沿着水平或者垂直方向排列子组件,如
Row
和Column
,有主轴和纵轴之分 -
弹性布局:允许子组件按照一定比例来分配父组件的空间。主要通过
Flex
和Expanded
来实现
Row
和Column
继承自FlexExpanded
只能作为Flex的孩子,否则会报错
-
流式布局:Row默认只有一行,如果超出屏幕不会折行。我们把超出屏幕显示范围会自动折行的布局称为流式布局,主要通过
Wrap
和Flow
(很少用)实现 -
层叠布局:层叠布局和
Web 中的绝对定位
类似,子组件可以根据距父容器四个角的位置来确定自身的位置。层叠布局允许子组件按照顺序堆叠起来。Flutter中使用Stack
和Positioned
配合实现绝对定位。Stack
允许子组件堆叠,而Positioned
用于根据Stack
的四个角来确定子组件的位置。 -
Align相对定位:
Align
组件的特性和Web开发中相对定位(position: relative
)相似 -
网格和列表布局:
GridView
和ListView
三.自适应和响应式布局
摘自官方文档,两者区别本人理解仍不是很清晰😶
参考文档: