第一部分 开发准备
第1 章 准备开发 2
1.1 命令行界面 2
1.1.1 任务:Windows 系统下准备命令行界面Cmder 2
1.1.2 任务:在macOS 系统下准备命令行界面Terminal 3
1.1.3 任务:熟悉基本命令 3
1.1.4 理解环境变量目录 5
1.1.5 知道命令来自哪里 5
1.1.6 命令行工具的帮助信息 6
1.1.7 命令行界面的配置文件 6
1.2 代码编辑器 7
1.3 源代码管理 8
第2章 开发环境 9
2.1 下载开发工具包 9
2.1.1 任务:macOS 系统下安装Flutter 9
2.1.2 任务:Windows 系统下安装Flutter 10
2.1.3 任务:配置使用国内镜像 11
2.2 准备iOS 与macOS 应用开发环境 11
2.2.1 任务:安装Rosetta 12
2.2.2 任务:安装Homebrew 12
2.2.3 任务:安装与准备Xcode 12
2.3 准备Android平台应用开发环境 13
2.4 准备设备模拟器 14
2.5 准备Web 应用开发环境 15
2.6 准备代码编辑器VSCode 15
2.7 创建Flutter 项目 16
2.7.1 任务:创建并运行Flutter 项目 16
2.7.2 任务:清理项目与源代码管理 18
2.8 问题与思考 18
第3章 熟悉Dart 语言 21
3.1 准备工作 21
3.2 变量 22
3.2.1 var 22
3.2.2 final 22
3.2.3 const 23
3.2.4 理解var、final 与const 的区别 23
3.3 类型 25
3.4 内置类型 25
3.4.1 字符串 25
3.4.2 数字 26
3.4.3 布尔值 26
3.4.4 列表 27
3.4.5 集合 27
3.4.6 映射 28
3.5 函数 28
3.5.1 创建函数 29
3.5.2 执行函数 29
3.5.3 函数参数 29
3.5.4 函数有多个参数 29
3.5.5 有名字的参数 30
3.5.6 必填参数 30
3.5.7 参数默认值 31
3.5.8 函数返回值 31
3.6 流程控制 31
3.6.1 if 语句 32
3.6.2 switch 语句 32
3.7 异常 34
3.7.1 抛出异常(throw) 34
3.7.2 捕获异常(catch/on) 34
3.8 类 35
3.8.1 定义一个类 36
3.8.2 实例化一个类 36
3.8.3 属性 36
3.8.4 构造方法 37
3.8.5 this 关键字 37
3.8.6 带名字的构造方法 38
3.8.7 方法 38
3.8.8 继承 39
3.8.9 类属性 39
3.8.10 类方法 40
3.9 泛型 40
3.10 库 41
3.10.1 使用内置库 41
3.10.2 指定库前缀 41
3.10.3 导入部分库 42
3.10.4 导入开发者个人库里的资源 42
3.11 Future 42
3.11.1 定义异步函数 43
3.11.2 使用异步函数提供的值 43
3.11.3 处理异步函数遇到的错误 44
第4章 包管理 45
4.1 包(Package) 45
4.2 pubspec.yaml 文件 45
4.3 安装包 46
4.3.1 解决包依赖问题 46
4.3.2 dependencies 属性 46
4.3.3 版本号 47
4.3.4 pubspec.lock 文件 47
4.3.5 package_config.json 文件 47
4.4 使用包 48
4.5 升级包 48
第二部分 Flutter基础
第5章 基本部件 52
5.1 准备 52
5.1.1 任务:准备项目(widget) 52
5.1.2 任务:准备应用入口 52
5.2 小部件(Widget) 53
5.3 自定义一个无状态的小部件 54
5.4 Text(文本) 56
5.5 RichText(富文本) 58
5.6 Image(图像) 59
5.6.1 任务:显示资源包里的图像 60
5.6.2 任务:显示来自网络的图像 61
5.6.3 任务:调整图像的显示 62
5.7 Container(容器) 63
5.7.1 任务:使用Container 小部件 64
5.7.2 任务:装饰容器 66
5.8 整理项目 69
第6章 页面结构 70
6.1 准备项目(page-structure) 70
6.2 MaterialApp 70
6.2.1 任务:创建Material 应用 70
6.2.2 任务:使用图标(Icon) 71
6.2.3 任务:使用按钮(ElevatedButton) 72
6.2.4 任务:定制应用的主题样式 73
6.3 Scaffold(页面结构) 75
6.4 AppBar(应用栏) 76
6.5 TabBar(标签栏) 77
6.6 BottomNavigationBar(底部导航栏) 79
6.6.1 任务:设置底部导航栏 79
6.6.2 任务:把App 转换成有状态小部件(StatefulWidget) 80
6.6.3 任务:单击底部导航栏项目,切换当前活动项目 81
6.6.4 任务:单击底部导航栏项目,切换显示小部件 82
6.6.5 任务:单击底部导航栏项目,动态显示或隐藏AppBar 83
6.7 FloatingActionButton(漂浮动作按钮) 84
6.8 整理项目 85
第7章 定义部件 86
7.1 准备 86
7.1.1 任务:准备项目(define-widget) 86
7.1.2 任务:配置VSCode 编辑器代码片断 87
7.2 AppPageHeader(页面头部) 88
7.3 AppLogo(应用标志) 89
7.4 AppPageMain(页面主体) 90
7.5 PostIndex(内容索引) 93
7.6 AppPageBottom(页面底部) 94
7.7 AppFloatingActionButton(漂浮动作按钮) 96
7.8 目录结构 97
7.9 小部件树 97
7.10 整理项目 98
第8章 弹窗对话 99
8.1 准备项目(modal-dialog) 99
8.2 BottomSheet(底部面板) 99
8.2.1 任务:显示页面底部面板 99
8.2.2 任务:用漂浮动作按钮显示与关闭底部面板 101
8.3 AlertDialog(警告对话框) 103
8.4 SnackBar(消息提示栏) 105
8.5 Drawer(边栏抽屉) 106
8.5.1 任务:使用边栏抽屉 107
8.5.2 任务:设置边栏抽屉上显示的内容(ListView 与ListTile) 108
8.6 PopupMenuButton(弹出菜单按钮) 111
8.7 整理项目 113
第9章 页面布局 114
9.1 准备 114
9.1.1 任务:准备项目(layout) 114
9.1.2 任务:准备练习页面 114
9.2 约束 116
9.2.1 任务:理解小部件的约束 116
9.2.2 任务:准备一个布局演示项目小部件 119
9.2.3 任务:使用安全区域(SafeArea)和尺寸盒子(SizedBox) 120
9.3 Align(对齐) 121
9.4 Column(栏/列) 122
9.5 Row(行/排) 124
9.6 Expanded(扩展空间) 126
9.7 Stack(堆) 127
9.8 Positioned(定位) 128
9.9 整理项目 128
第10 章 表单元素 129
10.1 准备 129
10.1.1 任务:准备项目(input) 129
10.1.2 任务:准备练习小部件PlaygroundInput 129
10.2 ElevatedButton(按钮) 130
10.3 TextField(文本字段) 133
10.3.1 任务:使用文本字段小部件 133
10.3.2 任务:获取文本字段里的数据 135
10.4 TextFormField(文本表单字段) 137
10.4.1 任务:使用文本表单字段 137
10.4.2 任务:验证文本表单字段数据 138
10.5 TextEditingController(文本编辑控制器) 141
10.6 Form(表单) 143
10.7 问题与思考 144
10.8 整理项目 144
第11章 路由导航(一) 145
11.1 准备 145
11.1.1 任务:准备项目(routing) 145
11.1.2 任务:准备导航与路由演示小部件 145
11.2 路由与导航器 146
11.3 用命令式管理路由 146
11.4 默认路由 149
11.5 路由表 151
11.6 生成路由时的回调 152
11.6.1 任务:使用生成路由回调onGenerateRoute 152
11.6.2 任务:在路由名字中提取参数 154
11.7 问题与思考 157
11.8 整理项目 157
第12章 状态管理 158
12.1 准备 158
12.1.1 任务:准备项目(state-management) 158
12.1.2 任务:准备状态管理演示小部件 158
12.1.3 任务:安装provider 159
12.2 准备数据 160
12.3 提供数据 161
12.3.1 确定提供数据的位置 162
12.3.2 任务:用Provider 提供数据与方法 162
12.4 使用数据 163
12.5 数据变化 165
12.5.1 任务:用ChangeNotifierProvider提供数据与方法 165
12.5.2 任务:在小部件里使用Provider 提供的数据与方法(Consumer) 167
12.6 问题与思考 168
12.7 整理项目 168
第13章 路由导航(二) 169
13.1 准备项目(routing_2) 169
13.2 页面 169
13.2.1 任务:使用Navigator 声明式接口(Pages API) 169
13.2.2 任务:使用MultiProvider 提供多个数据类 171
13.2.3 任务:动态添加与移除页面 173
13.3 路由器 176
13.3.1 任务:创建路由器代表(RouterDelegate) 176
13.3.2 任务:使用路由器管理路由(Router) 177
13.3.3 任务:应用状态变化时通知Router 重建Navigator 180
13.4 路由配置 181
13.4.1 调试Web 应用 181
13.4.2 任务:定义路由配置类型 181
13.4.3 任务:把路由信息转换成自定义的路由配置(parseRouteInformation) 182
13.4.4 任务:根据路由配置数据修改应用状态(setNewRoutePath) 184
13.4.5 任务:把路由配置转换成路由信息(restoreRoute Information) 185
13.5 问题与思考 188
13.6 整理项目 188
第14章 网络请求 189
14.1 准备 189
14.1.1 任务:准备项目(http) 189
14.1.2 任务:准备网络请求演示小部件 189
14.2 http 190
14.2.1 任务:安装http 并使用资源 190
14.2.2 任务:请求服务端接口获取数据 191
14.2.3 任务:将JSON 数据转换成自定义类型 193
14.2.4 任务:请求服务端接口创建内容(用户) 195
14.2.5 任务:发送用户登录请求 197
14.2.6 任务:请求服务端接口更新内容(用户) 200
14.3 序列化 202
14.4 问题与思考 205
14.5 整理项目 205
第三部分 Flutter实践
第15章 内容列表 208
15.1 准备项目(list) 208
15.2 应用配置 208
15.3 创建内容列表 210
15.3.1 任务:创建内容列表小部件(PostList) 210
15.3.2 任务:定义并提供获取内容列表数据方法 211
15.3.3 任务:请求内容列表数据 213
15.3.4 任务:定义内容数据类型 214
15.3.5 任务:转换生成一组内容(Post)类型的数据 217
15.3.6 任务:使用ListView 构建内容列表视图 220
15.4 整理项目 221
第16章 列表项目 222
16.1 准备项目(list-item) 222
16.2 定义列表项目 222
16.2.1 任务:创建内容列表项目小部件(PostListItem) 222
16.2.2 任务:定义内容媒体小部件(PostMedia) 224
16.2.3 任务:定义内容头部小部件(PostHeader) 226
16.2.4 任务:定义用户头像小部件(UserAvatar) 228
16.2.5 任务:定义内容动作小部件(PostActions) 230
16.3 问题与思考 233
16.4 整理项目 234
第17章 内容页面 235
17.1 准备项目(post) 235
17.2 开发单个内容页面 235
17.2.1 任务:处理单击内容列表项目图像 235
17.2.2 任务:定义单个内容数据模型(PostShowModel) 237
17.2.3 任务:单击内容项目图像时显示内容页面 240
17.2.4 任务:定义内容页面主体小部件(PageShowMain) 243
17.2.5 任务:定义内容正文小部件(PostContent) 247
17.2.6 任务:定义内容标签小部件(PostTags) 249
17.2.7 任务:配置路由器处理内容页面 251
17.2.8 任务:请求内容页面需要的数据 254
17.3 问题与思考 256
17.4 整理项目 259
第18章 验证身份 260
18.1 准备项目(auth) 260
18.2 登录页面 260
18.2.1 任务:添加用户登录页面 260
18.2.2 任务:准备登录表单小部件(AuthLoginForm) 263
18.3 请求登录 270
18.3.1 任务:定义用户登录相关类型(LoginData,Auth) 270
18.3.2 任务:自定义网络请求异常(HttpException) 271
18.3.3 任务:定义身份验证模型(AuthModel) 272
18.3.4 任务:请求用户登录 274
18.4 问题与思考 276
18.5 整理项目 276
第19章 状态管理 277
19.1 准备项目(state-management_2) 277
19.2 改造创建Provider 的方式 277
19.2.1 任务:使用Provider 的value 构造方法提供值 277
19.2.2 任务:在单独的文件里定义要提供的Provider 278
19.3 在用户设备上存取数据 279
19.3.1 任务:用shared preferences 插件记住登录状态 279
19.3.2 任务:应用启动以后恢复登录状态 282
19.4 使用代理Provider 解决依赖 285
19.4.1 任务:定义应用服务与接口客户端(AppService 和ApiHttpClient) 285
19.4.2 任务:用ChangeNotifierProxyProvider解决依赖 287
19.4.3 任务:改造PostIndexModel 用apiHttpClient 发送请求 288
19.5 整理项目 289
第20章 点赞内容 290
20.1 准备项目(like) 290
20.2 点赞内容相关操作 290
20.2.1 任务:使用GestureDetector 处理手势动作 290
20.2.2 任务:定义点赞内容模型 291
20.2.3 任务:定义取消点赞模型 292
20.2.4 任务:定义提供点赞的Provider 293
20.2.5 任务:处理用户点赞动作 294
20.2.6 任务:处理用户取消点赞动作 296
20.3 问题与思考 298
20.4 整理项目 298
第21章 列表布局 299
21.1 准备项目(post-list-layout) 299
21.2 内容列表布局 299
21.2.1 任务:准备热门内容列表 299
21.2.2 任务:准备内容列表布局相关数据与方法 301
21.2.3 任务:设置与存储内容列表布局 302
21.2.4 任务:准备网格内容列表 303
21.2.5 任务:准备多种布局的内容列表项目 305
21.2.6 任务:恢复内容列表布局 308
21.3 问题与思考 310
21.4 整理项目 312