Flutter 实战:构建跨平台应用

立山  论坛元老 | 2025-3-31 05:49:20 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1855|帖子 1855|积分 5565


一、简介

Flutter是由Google开辟的一款开源移动应用开辟框架,它可以帮助开辟者在iOS和Android平台上快速、高效地开辟应用。Flutter使用Dart语言作为开辟语言,具有跨平台兼容性高、开辟服从快、性能优秀等特点。本文将通过实战案例,介绍怎样使用Flutter构建跨平台应用。
二、开辟情况搭建

在开始Flutter开辟之前,需要先安装Flutter SDK和开辟情况。可以按照Flutter官方文档的指引,下载并安装Flutter SDK,以及设置开辟情况。
三、实战案例:开辟一个简朴的天气应用

本案例将通过使用Flutter开辟一个简朴的天气应用,介绍Flutter的开辟流程和常用组件。
1. 项目创建

在终端中进入要创建项目标目次,然后运行以下命令创建一个新的Flutter项目:
  1. flutter create weatherapp
复制代码
2. 界面设计

进入项目目次,打开lib/main.dart文件,可以看到默认的Flutter界面代码。在这个文件中,我们可以编写应用的界面和逻辑代码。为了让应用更加美观和易用,我们可以使用Flutter提供的各种组件和结构。比如,我们可以使用MaterialApp组件来设置应用的主题和导航,使用Container组件来设置容器和配景,使用Text组件来显示文本信息,等等。
3. 数据获取

为了让天气应用可以或许及时获取并显示天气信息,我们需要使用网络哀求来获取数据。在Flutter中,我们可以使用http库来发送HTTP哀求。在pubspec.yaml文件中添加以下代码来引入http库:
  1. dependencies:
  2.   flutter:
  3.     sdk: flutter
  4.   http: ^0.12.0
复制代码
然后运行以下命令来更新依赖:
  1. flutter pub get
复制代码
4. 实现数据获取和处置惩罚

在main.dart文件中,我们可以使用HttpClient类来发送HTTP哀求,获取天气数据。然后,我们可以使用JsonDecoder类将JSON数据剖析为Dart对象,方便后续操作。示例代码如下:
  1. import 'package:http/http.dart' as http;
  2. import 'package:json_annotation/json_annotation.dart';
  3. import 'package:weatherapp/models/weather.dart';
  4. void main() async {
  5.   // 发送HTTP请求,获取天气数据
  6.   final response = await http.get('https://api.example.com/weather');
  7.   // 解析JSON数据
  8.   final jsonData = jsonDecode(response.body);
  9.   final weatherData = Weather.fromJson(jsonData);
  10.   // 处理天气数据,如显示在界面上
  11.   // ...
  12. }
复制代码
在上面的代码中,我们使用http.get方法发送GET哀求,获取天气数据的JSON字符串。然后,我们使用jsonDecode方法将JSON字符串剖析为Dart对象,方便后续操作。最后,我们使用Weather.fromJson方法将JSON数据剖析为Weather对象,方便后续操作。
5. 界面展示

最后,我们可以在界面上展示天气数据。在Flutter中,我们可以使用各种组件和结构来展示数据。比如,我们可以使用Text组件来显示天气温度和天气情况,使用ListView组件来展示未来几天的天气预告,等等。示例代码如下:
  1. import 'package:flutter/material.dart';
  2. import 'package:weatherapp/models/weather.dart';
  3. class WeatherApp extends StatelessWidget {
  4.   @override
  5.   Widget build(BuildContext context) {
  6.     return MaterialApp(
  7.       title: 'Weather App',
  8.       theme: ThemeData(
  9.         primarySwatch: Colors.blue,
  10.       ),
  11.       home: Scaffold(
  12.         appBar: AppBar(
  13.           title: Text('Weather App'),
  14.         ),
  15.         body: Center(
  16.           child: Text('Temperature: ${weatherData.temperature}°C'),
  17.           child: Text('Weather: ${weatherData.weather[0].description}'),
  18.         ),
  19.       ),
  20.     );
  21.   }
  22. }
复制代码
在上面的代码中,我们界说了一个WeatherApp组件作为应用的主界面。在这个组件中,我们使用MaterialApp组件来设置应用的主题和导航,使用Scaffold组件来设置应用的结构和导航栏,使用AppBar组件来设置导航栏的标题和样式,使用Center组件来设置结构的中央点,使用Text组件来显示天气温度和天气情况。需要留意的是,在上面的代码中,我们使用了名为weatherData的变量来生存天气数据,方便后续操作。
6. 添加动态结果和交互

为了让天气应用更加生动和易用,我们可以添加一些动态结果和交互。比如,我们可以使用Flutter提供的AnimationController类来控制动画的播放和速度,使用Hero组件来实现页面之间的转场动画,使用RaisedButton组件来添加交互按钮,等等。示例代码如下:
  1. import 'package:flutter/material.dart';
  2. import 'package:weatherapp/models/weather.dart';
  3. class WeatherApp extends StatelessWidget {
  4.   @override
  5.   Widget build(BuildContext context) {
  6.     return MaterialApp(
  7.       title: 'Weather App',
  8.       theme: ThemeData(
  9.         primarySwatch: Colors.blue,
  10.       ),
  11.       home: Scaffold(
  12.         appBar: AppBar(
  13.           title: Text('Weather App'),
  14.         ),
  15.         body: Center(
  16.           child: Text('Temperature: ${weatherData.temperature}°C'),
  17.           child: Text('Weather: ${weatherData.weather[0].description}'),
  18.           child: Hero(
  19.             tag: 'weather-app',
  20.             child: Container(
  21.               color: Colors.lightBlueAccent,
  22.               child: ListView.builder(
  23.                 itemCount: weatherData.weather.length,
  24.                 itemBuilder: (BuildContext context, int index) {
  25.                   return ListTile(
  26.                     title: Text('${weatherData.weather[index].description}'),
  27.                     leading: Icon(Icons.ac_unit),
  28.                     trailing: Icon(Icons.access_time),
  29.                     onTap: () {
  30.                       // 跳转到详细页面
  31.                     },
  32.                   );
  33.                 },
  34.               ),
  35.             ),
  36.           ),
  37.         ),
  38.       ),
  39.     );
  40.   }
  41. }
复制代码
在上面的代码中,我们使用Hero组件来实现页面之间的转场动画。同时,我们使用ListView.builder组件来展示未来几天的天气预告,使用ListTile组件来界说每个天气的标题、图标和操作按钮。当用户点击操作按钮时,可以跳转到具体页面,展示该天气的具体信息。需要留意的是,在上面的代码中,我们使用了名为weatherData的变量来生存天气数据,方便后续操作。
7. 添加网络错误处置惩罚

在实现天气应用时,我们需要考虑到网络错误的情况。当网络连接失败或者哀求超时时,我们需要给出相应的错误提示,以便用户相识情况。在Flutter中,我们可以使用try-catch语句来捕获异常,并举行相应的错误处置惩罚。示例代码如下:
  1. void main() async {
  2.   try {
  3.     // 发送HTTP请求,获取天气数据
  4.     final response = await http.get('https://api.example.com/weather');
  5.     // 解析JSON数据
  6.     final jsonData = jsonDecode(response.body);
  7.     final weatherData = Weather.fromJson(jsonData);
  8.     // 处理天气数据,如显示在界面上
  9.     // ...
  10.   } catch (error) {
  11.     // 发生异常,进行错误处理
  12.     print(error);
  13.     // 显示网络错误提示,例如:重新加载或检查网络连接
  14.   }
  15. }
复制代码
在上面的代码中,我们使用try-catch语句来捕获异常。当发生异常时,我们打印错误信息,并可以举行相应的错误处置惩罚,例如:显示网络错误提示,让用户重新加载或者检查网络连接。
8. 添加革新功能

为了让天气应用更加易用,我们可以添加革新功能。当用户需要更新天气数据时,可以通过手动革新来获取最新的天气数据。在Flutter中,我们可以使用RefreshIndicator组件来实现革新功能。示例代码如下:
  1. void main() async {
  2.   // 初始化变量,记录是否已经加载过数据
  3.   bool hasLoadedData = false;
  4.   
  5.   runApp(MaterialApp(
  6.     title: 'Weather App',
  7.     home: Scaffold(
  8.       appBar: AppBar(title: Text('Weather App')),
  9.       body: Center(
  10.         child: RefreshIndicator(
  11.           onRefresh: () async {
  12.             if (!hasLoadedData) {
  13.               // 第一次加载数据,直接获取天气数据并显示在界面上
  14.               final response = await http.get('https://api.example.com/weather');
  15.               final weatherData = Weather.fromJson(jsonDecode(response.body));
  16.               // 处理天气数据,如显示在界面上
  17.               hasLoadedData = true; // 标记已经加载过数据,避免重复加载
  18.             } else {
  19.               // 非第一次加载数据,执行刷新操作(例如:重新获取天气数据并显示在界面上)
  20.               // ...
  21.             }
  22.           },
  23.           child: Column(children: [ /* 显示天气数据的组件 */ ]),
  24.         ),
  25.       ),
  26.     ),
  27.   ));
  28. }
复制代码
在上面的代码中,我们使用RefreshIndicator组件来实现革新功能。当用户手动革新时,会触发onRefresh回调函数。在该函数中,我们可以实验相应的革新操作,例如:重新获取天气数据并显示在界面上。需要留意的是,我们在onRefresh回调函数中判断了是否已经加载过数据。假如是第一次加载数据,我们会直接获取天气数据并显示在界面上;否则,我们会实验革新操作(例如:重新获取天气数据并显示在界面上)。这样就可以制止重复加载数据和不必要的革新操作。
9. 添加定位功能

为了让天气应用更加个性化,我们可以添加定位功能。通过获取用户的地理位置信息,我们可以获取用户地点地的天气数据,并为其提供更准确的天气预告服务。在Flutter中,我们可以使用geolocator插件来获取用户的地理位置信息。示例代码如下:
首先,在pubspec.yaml文件中添加geolocator插件的依赖:
  1. dependencies:
  2.   flutter:
  3.     sdk: flutter
  4.   geolocator: ^5.1.1
复制代码
然后,在代码中使用geolocator插件来获取用户的地理位置信息:
  1. import 'package:flutter/material.dart';
  2. import 'package:geolocator/geolocator.dart';
  3. class WeatherApp extends StatelessWidget {
  4.   @override
  5.   Widget build(BuildContext context) {
  6.     return MaterialApp(
  7.       title: 'Weather App',
  8.       theme: ThemeData(
  9.         primarySwatch: Colors.blue,
  10.       ),
  11.       home: Scaffold(
  12.         appBar: AppBar(title: Text('Weather App')),
  13.         body: Center(
  14.           child: Text('Temperature: ${weatherData.temperature}°C'),
  15.           child: Text('Weather: ${weatherData.weather[0].description}'),
  16.           child: Hero(
  17.             tag: 'weather-app',
  18.             child: Container(
  19.               color: Colors.lightBlueAccent,
  20.               child: ListView.builder(
  21.                 itemCount: weatherData.weather.length,
  22.                 itemBuilder: (BuildContext context, int index) {
  23.                   return ListTile(
  24.                     title: Text('${weatherData.weather[index].description}'),
  25.                     leading: Icon(Icons.ac_unit),
  26.                     trailing: Icon(Icons.access_time),
  27.                     onTap: () {
  28.                       // 跳转到详细页面
  29.                     },
  30.                   );
  31.                 },
  32.               ),
  33.             ),
  34.           ),
  35.         ),
  36.       ),
  37.     );
  38.   }
  39. }
复制代码
10. 添加通知功能

为了提醒用户天气厘革或者告急通知,我们可以添加通知功能。在Flutter中,我们可以使用flutter_local_notifications插件来发送本地通知。示例代码如下:
首先,在pubspec.yaml文件中添加flutter_local_notifications插件的依赖:
  1. dependencies:
  2.   flutter:
  3.     sdk: flutter
  4.   flutter_local_notifications: ^8.0.0
复制代码
然后,在代码中使用flutter_local_notifications插件来发送通知:
  1. import 'package:flutter/material.dart';
  2. import 'package:flutter_local_notifications/flutter_local_notifications.dart';
  3. class WeatherApp extends StatelessWidget {
  4.   static void showNotification(BuildContext context, String message) {
  5.     showLocalNotification(
  6.       context: context,
  7.       builder: (BuildContext context) {
  8.         return AlertDialog(
  9.           title: Text('Weather Alert'),
  10.           content: Text(message),
  11.           actions: [
  12.             TextButton(
  13.               child: Text('Dismiss'),
  14.               onPressed: () {},
  15.             ),
  16.           ],
  17.         );
  18.       },
  19.       notificationBuilder: (BuildContext context, int notificationId) {
  20.         return SimpleNotification(title: 'Weather Alert', description: 'Check out the weather forecast!', color: Colors.lightBlueAccent);
  21.       },
  22.     );
  23.   }
  24. }
复制代码
11. 添加数据长期化功能

为了让天气应用在用户重新打开时仍然保留之前的数据,我们可以添加数据长期化功能。在Flutter中,我们可以使用shared_preferences插件来生存和读取用户的设置和数据。示例代码如下:
首先,在pubspec.yaml文件中添加shared_preferences插件的依赖:
  1. dependencies:
  2.   flutter:
  3.     sdk: flutter
  4.   shared_preferences: ^2.0.5
复制代码
然后,在代码中使用shared_preferences插件来生存和读取数据:
  1. import 'package:flutter/material.dart';
  2. import 'package:shared_preferences/shared_preferences.dart';
  3. class WeatherApp extends StatefulWidget {
  4.   @override
  5.   _WeatherAppState createState() => _WeatherAppState();
  6. }
  7. class _WeatherAppState extends State<WeatherApp> {
  8.   String _temperature = '';
  9.   String _weather = '';
  10.   bool _isFavorited = false;
  11.   @override
  12.   void initState() {
  13.     super.initState();
  14.     readData();
  15.   }
  16.   void readData() async {
  17.     SharedPreferences prefs = await SharedPreferences.getInstance();
  18.     _temperature = prefs.getString('temperature');
  19.     _weather = prefs.getString('weather');
  20.     _isFavorited = prefs.getBool('isFavorited');
  21.   }
  22.   void saveData() async {
  23.     SharedPreferences prefs = await SharedPreferences.getInstance();
  24.     prefs.setInt('temperature', 25); // 这里的键值需要和读取时的保持一致,否则无法保存成功。同时这里的value是int类型,需要转为String保存。
  25.     prefs.setString('weather', 'Sunny');
  26.     prefs.setBool('isFavorited', true);
  27.   }
  28. }
复制代码

《Flutter小白开辟——跨平台客户端应用开辟学习路线》


内容简介

《Flutter小白开辟——跨平台客户端应⽤开辟学习路线》以移动平台(iOS/安卓)与Web 平台为例,体系地介绍怎样基于Flutter 框架开辟跨平台的应用。
《Flutter小白开辟——跨平台客户端应⽤开辟学习路线》分为三大部门,共27 章。第一部门(第1~4 章)告急介绍开辟前要做的准备工作,包括安装命令行界面、开辟情况,认识Dart 语言和包管理知识;第二部门(第5~14 章)领导大家认识和理解Flutter框架,掌握Flutter 应用开辟的基础知识;第三部门(第15~27 章)是Flutter 实践,联合服务端应用接口,实现一些真实应用里经常用到的界面,并将做好的应用发布到应用商店。
《Flutter小白开辟——跨平台客户端应⽤开辟学习路线》提供了一套体系、全面的训练使命,从易到难,轻松风趣。从准备开辟工具与开辟情况开始,认识程序语言,相识应用框架,直到具体实践与应用分发,引领大家渐渐掌握Flutter 应用框架的使用技巧,得到开辟移动端应用的基础能力,对于初学者来说非常友好。
作者简介

王皓,宁皓网作者,独立开辟者,自学应用开辟十年有余,创作过数百万字的应用技术内容与数百小时的技术视频,内容覆盖Web技术、客户端与服务端应用开辟,内容风格简朴有用,逻辑清晰,帮助无数技术爱好者掌握了应用开辟技能。
目次

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

立山

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表