包含 Flutter 常用的组件、布局、方法等。初学者的完整快速参考
入门
macOS 操作系统上安装和配置
完整教程请参阅 Flutter 中文社区的 安装和环境配置
1 | $ sudo softwareupdate --install-rosetta --agree-to-license |
在 Apple 芯片的 Mac 电脑 上,还需要安装 Rosetta 2 环境因为 一些辅助工具 仍然需要,通过手动运行上面的命令来安装
获取 Flutter SDK
安装包来获取最新的 stable Flutter SDK:
Apple 芯片
flutter_macos_arm64_3.22.2-stable.zip
想要获取到其他版本的安装包,请参阅 SDK 版本列表 页面
将文件解压到目标路径, 比如:
1
2$ cd ~/development
$ unzip ~/Downloads/flutter_macos_3.22.2-stable.zip配置
flutter
的 PATH 环境变量:1
$ export PATH="$PATH:`pwd`/flutter/bin"
运行
flutter doctor
命令
Windows 操作系统上安装和配置
完整教程请参阅 Flutter 中文社区的 安装和环境配置
- 点击下方的安装包,获取 stable 发行通道的 Flutter SDK 最新版本:
- flutter_windows_3.22.2-stable.zip
- 要查看其他发行通道和以往的版本,请参阅 SDK 版本列表 页面
- 将压缩包解压,然后把其中的
flutter
目录整个放在你想放置Flutter SDK
的路径中(例如C:\src\flutter
) - 更新
path
环境变量,在开始菜单的搜索功能键入「env」
,然后选择编辑系统环境变量
。在用户变量
一栏中,检查是否有Path
这个条目:- 如果存在这个条目,以
;
分隔已有的内容,加入flutter\bin
目录的完整路径。 - 如果不存在的话,在用户环境变量中创建一个新的 Path 变量,然后将
flutter\bin
所在的完整路径作为新变量的值
- 如果存在这个条目,以
如果你不想安装指定版本的安装包。可以忽略步骤 1
和 2
。从 GitHub
上的 Flutter repo
获取源代码,并根据需要,切换到指定的分支或标签
1 | C:\src>git clone https://github.com/flutter/flutter.git -b stable |
基础组件
Text 样式文本
1 | Text("Hello world", |
TextStyle 指定文本显示的样式
1 | Text("Hello world", |
TextSpan 文本的一个“片段”
1 | Text.rich(TextSpan( |
DefaultTextStyle 文本默认样式
1 | DefaultTextStyle( |
字体设置加载
在 asset 中声明,要先在
pubspec.yaml
中声明它1
2
3
4
5
6
7
8
9
10
11
12flutter:
fonts:
- family: Raleway
fonts:
- asset: assets/fonts/Raleway-Regular.ttf
- asset: assets/fonts/Raleway-Medium.ttf
weight: 500
- asset: assets/fonts/Raleway-SemiBold.ttf
weight: 600
- family: AbrilFatface
fonts:
- asset: assets/fonts/abrilfatface/AbrilFatface-Regular.ttf将字体文件复制到在
pubspec.yaml
中指定的位置使用字体
1
2
3
4
5
6
7
8
9// 声明文本样式
const textStyle = const TextStyle(
fontFamily: 'Raleway',
);
// 使用文本样式
var buttonText = const Text(
"Use the font for this text",
style: textStyle,
);
ElevatedButton “漂浮”按钮
1 | ElevatedButton( |
TextButton 文本按钮
1 | TextButton( |
OutlineButton 边框阴影且背景透明按钮
1 | OutlineButton( |
IconButton 可点击的图标按钮
1 | IconButton( |
带图标的按钮
1 | ElevatedButton.icon( |
从 asset 中加载图片
在工程根目录下创建一个
images目录
,并将图片aaa.png
拷贝到该目录。在
pubspec.yaml
中的flutter
部分添加如下内容:1
2assets:
- images/aaa.png注意: 由于 yaml 文件对缩进严格,所以必须严格按照每一层两个空格的方式进行缩进,此处 assets 前面应有两个空格。
加载该图片
1
2
3
4Image(
image: AssetImage("images/aaa.png"),
width: 100.0
);Image 也提供了一个快捷的构造函数
Image.asset
用于从asset
中加载、显示图片:1
2
3Image.asset("images/aaa.png",
width: 100.0,
)
从网络加载图片
1 | Image( |
Image 也提供了一个快捷的构造函数 Image.network
用于从网络加载、显示图片:
1 | Image.network( |
Image 参数
1 | const Image({ |
Switch 单选开关
1 | Switch( |
Checkbox 复选框
1 | Checkbox( |
TextField 文本输入框
1 | TextField( |
LinearProgressIndicator 线性、条状的进度条
模糊进度条(会执行一个动画)
1 | LinearProgressIndicator( |
进度条显示 50%
1 | LinearProgressIndicator( |
CircularProgressIndicator 圆形进度条
模糊进度条(会执行一个旋转动画)
1 | CircularProgressIndicator( |
进度条显示 50%
,会显示一个半圆
1 | CircularProgressIndicator( |
自定义尺寸
线性进度条高度指定为 3
1 | SizedBox( |
圆形进度条直径指定为 100
1 | SizedBox( |
基础布局
Container
在实际开发中,Container常常用于对一个组件进行包装修饰。
1 | Container( |
将 Contianer
大小固定为 100 * 100
, 背景色为蓝色。把 Text
包裹在 Container
中,并将其居中
Column
列布局(Column),可以将多个子组件沿着垂直的方向摆放(竖的摆放)
1 | // 将container 和 button 摆放到同一列。 |
Row
行布局(Row),可以将多个组件沿水平的方向摆放。
1 | Row( |
在同一行摆放 3 个 Button
Wrap
将子组件从左到右依次排列,当空间不足时自动换行。
1 | Wrap( |
显示多个 Flutter
的 logo
并自动换行
Stack
Stack 可以将一多个子组件叠在一起显示。堆叠顺序按照children属性中的列表依次堆叠摆放,默认将子控件沿左上角对齐。
需要控制子控件位置可以嵌套Positoned
控件。
1 | Stack( |
依次堆叠 300*300
的蓝色色块、200*200
的黑色色块、100*100
的黄色色块
Positioned
若需要控制Stack中子控件的位置,则可以嵌套改控件。
1 | Stack( |
Align
Align组件用于决定子组件对齐方式
1 | // 使用Align将Button 居中在Container中 |
Center
Center 组件实际上继承于Align。用于专门剧中。
1 | //与 Align中代码效果一致 |
Flex
Flex 的用法与 Row
或 Column
类似,但只需要额外传入 direction
参数
Row
和Column
组件都继承Flex
组件- 设置
direction
为Axis.horizontal
表示水平方向(Row
),为Axis.vertical
则为垂直方向(Column
)
垂直方向依次摆放3个flutter logo
1 | Flex( |
水平方向依次摆放 3 个 flutter logo
1 | Flex( |
Expaneded
Expanded 用于扩张一个子组件。可以通过 flex
属性,用于表示该组件相对其他弹性组件放大的倍数(可以理解为一个权重)。
1 | // Container 会占满剩余的全部空用空间 |
Flexible
Flexible
是 Expanded
组件的父类。
与 Expanded
不同的是,Flexible
可以通过 fit
属性设置子控件是否必须占满 Flexibal
扩展的空间。而 Expaned
默认子控件必须占满
1 | // 如果将fit设置为tight, |
将 Flexible
的 fit
属性设置为 tingt
,就等价于使用 Expanded
Spacer
Spacer 用于在布局中留白
1 | Row( |
例如,需要文本和图标位于一个行的两端,而中间留白时。就可以使用 Spacer
ListView
ListView
是一个支持滚动的列表组件。该组件默认支持上下滑动。ListView
的默认构造函数,会立即初始化children
中的所有子widget
,无法动态加载。
1 | ListView( |
需要动态加载,则可以使用 ListView.builder()
命名构函数。
1 | // 动态生成4个Text |
需要在对ListView
中的Item
添加分割线,则可以借助ListView.separated()
。
1 | // separatorBuilder 函数用于在元素之间插入分割线。 |
GridView
GridView
可将元素显示为二维网格状的列表组件,并支持主轴方向滚动。
使用GridView() 构造函数,需要传入gridDelegate和children。Flutter中已经提供了两种实现方式,分别是:
SliverGridDelegateWithFixedCrossAxisCount()
用于交叉轴方向固定数。SliverGridDelegateWithMaxCrossAxisExtent()
用于交叉轴方向限制最大长度。
1 | // 使用SliverGridDelegateWithFixedCrossAxisCount |
GridView.builder()
命名构造可以实现元素的动态加载,与ListView.builder()
类似
1 | GridView.builder( |
Gridview.count()
一个简单的构造函数,只需要传入crossAxisCount
(交叉轴元素的个数)和children
即可。
1 | GridView.count( |
GridView.extent()
用于设定每个元素在交叉轴方向的最大尺寸。当程序运行在较大屏幕时通常能看到更多的元素,而不是少量元素的放大版。通过传入maxCrossAxisExtent
,Gridview
会根据屏幕尺寸自动选择合适的行数量。
1 | GridView.extent( |
GridView.count()
和GridView.extent()`可以看作GridView的语法糖。
PageView
使用PageView
可以实现整屏页面滚动,默认为水平方向翻页。与ListView
类似。
pageSnapping
参数可以设置滑动时Page
停留在任意位置。scrollDirection
参数设置滚动方向(默认为水平方向)。
1 | PageView( |
使用PageView.builder()
命名构造,可以动态加载页面。与ListView.builder()
类似。
1 | PageView.builder( |
另见
- Dart 备忘清单 (jaywcjlove.github.io)
- flutter 官网 (flutter.dev)
- flutter 中文社区官网 (flutter.cn)
- flutter 中文开发者社区 (flutterchina.club)