写点什么

dart 系列之: 在 dart 中使用生成器

作者:程序那些事
  • 2021 年 11 月 22 日
  • 本文字数:1010 字

    阅读完需:约 3 分钟

dart系列之:在dart中使用生成器

简介

ES6 中在引入异步编程的同时,也引入了 Generators,通过 yield 关键词来生成对应的数据。同样的 dart 也有 yield 关键词和生成器的概念。

什么时候生成器呢?所谓生成器就是一个能够持续产生某些数据的装置,也叫做 generator。

两种返回类型的 generator

根据是同步生成还是异步生成,dart 返回的结果也是不同的。

如果是同步返回,那么返回的是一个 Iterable 对象.

如果是异步返回,那么返回的是一个 Stream 对象。

同步的 generator 使用 sync*关键词如下:

Iterable<int> naturalsTo(int n) sync* {  int k = 0;  while (k < n) yield k++;}
复制代码

异步的 generator 使用的是 async* 关键词如下:

Stream<int> asynchronousNaturalsTo(int n) async* {  int k = 0;  while (k < n) yield k++;}
复制代码

生成关键词使用的是 yield。

如果 yield 后面跟着的本身就是一个 generator,那么需要使用 yield*。

Iterable<int> naturalsDownFrom(int n) sync* {  if (n > 0) {    yield n;    yield* naturalsDownFrom(n - 1);  }}
复制代码

Stream 的操作

stream 表示的是流,得到这个流之后,我们需要从流中取出对应的数据。

从 Stream 中取出数据有两种方式,第一种就是使用 Stream 本身的 API 来获取 Stream 中的数据。

最简单的就是调用 stream 的 listen 方法:

  StreamSubscription<T> listen(void onData(T event)?,      {Function? onError, void onDone()?, bool? cancelOnError});
复制代码

listen 可以接数据的处理方法,具体使用如下:

 final startingDir = Directory(searchPath);      startingDir.list().listen((entity) {        if (entity is File) {          searchFile(entity, searchTerms);        }      });
复制代码

默认的方法是 onData 方法。

另外一种就是今天要讲解的 await for.

await for 的语法如下:

await for (varOrType identifier in expression) {  // Executes each time the stream emits a value.}
复制代码

要注意的是上面的 expression 必须是一个 Stream 对象。并且 await for 必须用在 async 中,如下:

Future<void> main() async {  // ...  await for (final request in requestServer) {    handleRequest(request);  }  // ...}
复制代码

如果要想中断对 stream 的监听,则可以使用 break 或者 return。

总结

以上就是 dart 中生成器的使用了。

本文已收录于 http://www.flydean.com/13-dart-generators/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

发布于: 18 小时前阅读数: 7
用户头像

关注公众号:程序那些事,更多精彩等着你! 2020.06.07 加入

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧,尽在公众号:程序那些事!

评论

发布
暂无评论
dart系列之:在dart中使用生成器