Flutter 基础 4 | Dart 异步编程
在 Dart 的 Library 中有很多返回 Future 或 Steam 对象的函数,他们都是异步函数。
在 Dart 中,使用 async 和 await 关键字来实现异步编程,它可以让你用同步的方式来写异步代码。
Feature
Future 对象表示在未来的某个时刻的一个 value 或 error,所以 Future 可以定义一个 value 和 error 的回调。
创建 Future
一个普通的同步方法,如下:
1 | String getVersion() => '1.0.0'; |
将它声明成异步方法,则是这样的:
1 | Future<String> getVersion() async => '1.0.0'; |
通过使用 async 关键字标记一个函数,这个函数就变成了异步函数,它的返回值就变成了 Future<T>。在函数内你可以直接返回 T,Dart 会自动转换成 Future<T>。
当然你也可以,自己创建一个 Future 对象返回,这时函数的 async 标记就不是必须了:
1 | Future<String> getVersion() => Future.sync(() => "1.0.0"); |
1 | Future<String> getVersion() => Future.delayed(Duration(seconds: 1), () => "1.0.0"); |
处理 Future
1 | Future<String> version = getVersion(); |
1 | version.then((version) => {print(version)}).catchError((e) => {print(e)}); |
await 关键字表示等待一个异步函数的返回值,是阻塞式的。所以必须在这个方法上也标记上 async,这就是所谓的用同步的方式写异步代码。
1 | checkVersion() async { |
Stream
- Stream 表示一个异步的数据序列(数据流)
- Stream 可以来自用户事件,文件等等
- 使用
await for或listen()来操作 Stream - Stream 提供了一个处理错误的方式
- 有两种 Stream 定义订阅和广播
创建 Stream
使用 async* 标记一个函数,yield 返回 Stream 数据流
1 | Stream<int> countStream(int to) async* { |
处理 Stream
使用 awit for 来接收数据流
1 | await for (var value in stream) { |
使用 try catch 来处理错误
1 | Future<int> sumStream(Stream<int> stream) async { |
Steam 还有很多其他操作符,这部分和 RxJava 和 Java 8 的 Stream API 很像,包括 RxDart 的实现也是用了大量的 Stream,详情后续在介绍
相关文档
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 Gavin Liu - 代码人生与科技生活
评论