1.Flutter异步操作简介
-
Future 表示一个尚未完成但最终会完成的操作;
-
Future 是一个表示将来某个时间点会完成的操作的对象。它通常用于处理如网络请求、文件读写、数据库操作等异步I/O操作。Future 可以完成(完成时携带一个值)或者失败(失败时携带一个错误)。
-
async/await 是Dart语言提供的语法糖,使得异步代码的编写更加简洁和直观。
-
async 是一个修饰符,用于标记一个函数体内可能包含异步操作。它通常与 await 一起使用。
-
await 关键字用于等待一个 Future 完成,并获取它的结果。当 await 一个 Future 时,代码会暂停执行直到 Future 完成,然后将控制权交回给异步操作
所以Flutter中,我们可以使用Future
和async/await
来处理网络请求、文件读写、数据库操作等异步操作,保持应用的流畅性。
2. 使用Future
Future
表示可能在未来完成的操作,并提供了一种处理异步操作的方式。
通过创建Future
来执行异步任务,然后使用then
方法处理任务完成后的结果。
Future<int> _fetchLocalData() {
return Future.delayed(const Duration(seconds: 1), () {
// 耗时操作
return 100;
});
}
调用如下
_fetchLocalData().then((value) {
debugPrint('获取到的数据:$value');
}).catchError((error) {
debugPrint('发生错误:$error');
});
3. 使用async/await
async
关键字定义函数是异步,await
关键字用于等待异步操作完成;通过async/await
组合,实现异步调用。
Future<int> _fetchNetData() async {
await Future.delayed(const Duration(seconds: 2));
// 耗时操作
return 101;
}
调用如下
try {
var f = await _fetchNetData();
debugPrint('获取到的数据:$f');
} catch (e) {
debugPrint(e as String?);
}
使用async/await
可以让异步操作更简洁易懂,不必依赖于多个嵌套的then
回调。
4.容错处理
异步操作中,异常容错非常重要。可以使用catchError
捕获Future
中发生的错误,也可以使用try/catch
在async
函数中捕获错误。
Future<int> _fetchData() async {
try {
// 耗时操作
await Future.delayed(const Duration(seconds: 1));
return 102;
} catch (error) {
debugPrint('发生错误:$error');
return -1;
}
}
调用如下
var f = await _fetchData();
debugPrint('获取到的数据:$f');
5.完整示例代码
import 'package:flutter/material.dart';
class FutureWidget extends StatefulWidget {
const FutureWidget({super.key});
@override
FutureWidgetState createState() => FutureWidgetState();
}
class FutureWidgetState extends State<FutureWidget> {
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () {
_fetchLocalData().then((value) {
debugPrint('获取到的数据:$value');
}).catchError((error) {
debugPrint('发生错误:$error');
});
},
child: const Text('Future处理')),
const SizedBox(
height: 20,
),
ElevatedButton(
onPressed: () async {
try {
var f = await _fetchNetData();
debugPrint('获取到的数据:$f');
} catch (e) {
debugPrint(e as String?);
}
},
child: const Text('async/await处理')),
const SizedBox(
height: 20,
),
ElevatedButton(
onPressed: () async {
var f = await _fetchData();
debugPrint('获取到的数据:$f');
},
child: const Text('异常处理')),
],
);
}
Future<int> _fetchLocalData() {
return Future.delayed(const Duration(seconds: 1), () {
// 耗时操作
return 100;
});
}
Future<int> _fetchNetData() async {
await Future.delayed(const Duration(seconds: 2));
// 耗时操作
return 101;
}
Future<int> _fetchData() async {
try {
// 耗时操作
await Future.delayed(const Duration(seconds: 1));
return 102;
} catch (error) {
debugPrint('发生错误:$error');
return -1;
}
}
}
6.效果
Reloaded 3 of 2602 libraries in 909ms (compile: 69 ms, reload: 226 ms, reassemble: 486 ms).
flutter: 获取到的数据:100
flutter: 获取到的数据:101
flutter: 获取到的数据:102
flutter: 获取到的数据:100
flutter: 获取到的数据:101
flutter: 获取到的数据:102
7.小结
-
Future和async/Await异步操作,可以处理计算或IO类型的数据处理任务,避免在主UI线程中执行这些耗时任务。
-
与多线程相比,异步操作,轻量简洁,高效,易懂;
原文始发于微信公众号(ksnowlv):Flutter中Future和async/Await异步操作
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/254801.html