要点
Flutter 布局的核心机制是 widget。在 Flutter 中,几乎所有东西都是 widget — 甚至布局模型都是 widget。你在 Flutter 应用程序中看到的图像,图标和文本都是 widget。此外不能直接看到的也是 widget,例如用来排列、限制和对齐可见 widget 的行、列和网格。
布局
流程
- 选择一个布局Widget
- 创建一个可见Widget
- 将可见Widget添加到布局Widget
- 将布局Widget添加到页面
- 运行应用
Center
步骤1: 选择Center Widget
1 |
|
所有布局Widget
都具有以下任一项:
- 一个
child
属性,当布局Widget
只包含一个子项,比如Center
,Container
- 一个
children
属性,当布局Widget
包含多个子项,比如Row
,Column
,ListView
和Stack
对应 Material 应用,可以使用 Scaffold widget,它提供默认的 banner 背景颜色,还有用于添加抽屉、提示条和底部列表弹窗的 API
Row(列) , Column(行),Container , spacing, Padding, SizedBox, margin,Expanded
1 |
|
名称 | 说明 |
---|---|
Column | 垂直布局,可以包含多个子Widget,子Widget从上往下延伸 |
Row | 水平布局,可以包含多个子Widget,子Widget从左往右延伸 |
Container | 包含一个子Widget,一般用来包装显示的Widget,在这里设置宽高,内外边距 |
Padding | 包含一个子Widget,控制内边距 |
SizedBox | 包含一个子Widget,固定大小 |
Expanded | 包含一个子Widget,填充父Widget的剩余空间 |
GridView && ListView
使用 GridView 将 widget 作为二维列表展示。 GridView 提供两个预制的列表,或者你可以自定义网格。当 GridView 检测到内容太长而无法适应渲染盒时,它就会自动支持滚动。
GridView的特点
- 在网格中使用widget
- 当列的内容超出渲染容器时,它会自动支持滚动
- 创建自定义的网格,或者使用
GridView.count
设置列的数量/GridView.extent
设置单元格最大宽度
1 | Widget _buildGrid() => GridView.extent( |
ListView
是一个和Column
相似的Widget
,当内容大于自己的渲染框时,就会自动支持滚动
ListView
的特点
- 一个用来组织盒子中列表的专用
Column
- 可以水平或者垂直布局
- 当检测到空间不足时,会自动支持滚动
- 比
Column
的配置少,使用更容易,且支持滚动
1 | Widget _buildList() { |
里面每一行都是ListTile
,它是Material
库中专用的行Widget
,它可以很轻松的创建一个包含三行文本以及可选的行前和行尾图标的行。 ListTile
在 Card
或者 ListView
中最常用,但是也可以在别处使用。
Stack
Stack
布局用于叠加场景,比如图片上添加文字描述
Stack
的特点
- 用于覆盖另一个
Widget
– 类似栈:后进(渲染)先出(显示在外层) - 子列表中的第一个
Widget
是基础Widget
;后面的子项覆盖在基础Widget
的顶部 Stack
的内容是无法滚动的- 可以剪切掉超出渲染框的子项
Card
Material
库中的Card
包含相关有价值信息,几乎可以由任何Widget
组成,但是通常和ListTile
一起使用,Card
只有一个子项,这个子项可以是列,行,列表,网格或者其它支持多个子项的Widget
。默认情况下,Card
的大小是0x0像素。可以使用SizeBox
控制Card
的大小
在 Flutter
中,Card
有轻微的圆角和阴影来使它具有 3D
效果。改变 Card
的 elevation
属性可以控制阴影效果
1 | Widget _buildCard() { |
一些收获
CrossAxisAlignment(交叉轴) && MainAxisAlignment(主轴)
MainAxisAlignment
(主轴)就是与当前子Widget
延伸方向一致的轴,而CrossAxisAlignment
(交叉轴)就是与当前子Widget
延伸方向垂直的轴
比如Column
: 子Widget
是从上往下延伸的,所以主轴就是垂直方向,交叉轴就是水平方向的。
即Column
的 MainAxisAlignment
属性用于控制子Widget
在主轴(垂直轴)上的对齐方式,Column
的 CrossAxisAlignment
属性用于控制子Widget
在交叉轴(水平轴)上的对齐方式
当设置为CrossAxisAlignment.start
时表示Column
中的元素左对齐。
格式化
通过快捷键 ⌥(option) + ⇧(shift) + f
可以快速对代码格式化
内容不可见
Flutter
界面会告警提示当前的布局超过多少像素,存在内容不可见的问题
Waiting for another flutter command to release the startup lock
问题: VS Code 创建新的Flutter工程一直卡在Waiting for another flutter command to release the startup lock
方案:
1 | # 执行后关闭VS Code 重新打开再次创建Flutter工程 |
ERR : Proxy failed to establish tunnel (503 Forwarding failure), uri=//pub.flutter-io.cn:443
一般是网络原因,我是终端加了端口转发,然后一直访问不了pub.flutter-io.cn
,所以去掉代理
1 | # 去掉代理 + 重新执行 flutter pub get --verbose |