Dart笔记(21):Stream和Generators
Stream概念:Stream 就是流的意思,表示发出的一系列的异步数据。可以简单地认为 Stream 是一个异步数据源。它是 Dart 中处理异步事件流的统一 APIStream和Future都是Dart:async库的核心API,对异步提供了非常好的支持。思想和rxjava类似,将事件理解为流,Stream 和 Future 是 Dart 异步处理的核心 API。Futur...
Stream
概念:Stream 就是流的意思,表示发出的一系列的异步数据。可以简单地认为 Stream 是一个异步数据源。它是 Dart 中处理异步事件流的统一 API
Stream和 Future都是Dart:async库的核心API,对异步提供了非常好的支持。
思想和rxjava类似,将事件理解为流,Stream 和 Future 是 Dart 异步处理的核心 API。Future 表示稍后获得的一个数据,所有异步的操作的返回值都用 Future 来表示。但是 Future 只能表示一次异步获得的数据。而 Stream 表示多次异步获得的数据。比如界面上的按钮可能会被用户点击多次,所以按钮上的点击事件(onClick)就是一个 Stream 。简单地说,Future将返回一个值,而Stream将返回多次值。
获得Stream的方法:
- 通过构造函数
- 使用StreamController
- IO Stream
stream有三个构造方法:
-
Stream.fromFuture:从Future创建新的单订阅流,当future完成时将触发一个data或者error,然后使用Down事件关闭这个流。
-
Stream.fromFutures:从一组Future创建一个单订阅流,每个future都有自己的data或者error事件,当整个Futures完成后,流将会关闭。如果Futures为空,流将会立刻关闭。
-
Stream.fromIterable:创建从一个集合中获取其数据的单订阅流。
Stream.fromIntreable([1,2,3]);
监听Stream的方法
监听一个流最常见的方法就是listen。当有事件发出时,流将会通知listener。Listen方法提供了这几种触发事件:
- onData(必填):收到数据时触发
- onError:收到Error时触发
- onDone:结束时触发
- unsubscribeOnError:遇到第一个Error时是否取消订阅,默认为false
Generators 生成器
当您需要延迟地生成一个值序列时,请考虑使用生成器函数。Dart内置支持两种生成器函数:
- 同步生成器:返回Iterable对象
- 异步生成器:返回Stream对象
要实现同步生成器函数,将函数体标记为sync*,并使用yield语句传递值:
Iterable<int> naturalsTo(int n) sync* {
int k = 0;
while (k < n) yield k++;
}
要实现异步生成器函数,将函数体标记为async*,并使用yield语句传递值:
Stream<int> asynchronousNaturalsTo(int n) async* {
int k = 0;
while (k < n) yield k++;
}
如果您的生成器是递归的,您可以使用yield*来改进它的性能:
Iterable<int> naturalsDownFrom(int n) sync* {
if (n > 0) {
yield n;
yield* naturalsDownFrom(n - 1);
}
}
更多推荐
所有评论(0)