Dart笔记(21):Stream和Generators

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hxl517116279/article/details/88619839

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);
  }
}

  

猜你喜欢

转载自blog.csdn.net/hxl517116279/article/details/88619839