简介

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/

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

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

dart系列之:在dart中使用生成器的更多相关文章

  1. dart系列之:在dart中使用packages

    目录 简介 pubspec.yaml get packages 使用packages 升级依赖 总结 简介 java中使用jar包来封装有用的功能,然后将其分发到maven仓库中,供其他人使用.同样的 ...

  2. dart系列之:在dart中使用数字和字符串

    目录 简介 数字 字符串 StringBuffer 总结 简介 要想熟悉一种语言,最简单的做法就是熟悉dart提供的各种核心库.dart为我们提供了包括dart:core,dart:async,dar ...

  3. dart系列之:dart语言中的特殊操作符

    dart系列之:dart语言中的特殊操作符 目录 简介 普通操作符 类型测试操作符 条件运算符 级联符号 类中的自定义操作符 总结 简介 有运算就有操作符,dart中除了普通的算术运算的操作符之外,还 ...

  4. dart系列之:浏览器中的舞者,用dart发送HTTP请求

    目录 简介 发送GET请求 发送post请求 更加通用的操作 总结 简介 dart:html包为dart提供了构建浏览器客户端的一些必须的组件,之前我们提到了HTML和DOM的操作,除了这些之外,我们 ...

  5. dart系列之:创建Library package

    目录 简介 Library package的结构 导入library 条件导入和导出library 添加其他有效的文件 library的文档 发布到pub.dev 总结 简介 在dart系统中,有pu ...

  6. dart系列之:HTML的专属领域,除了javascript之外,dart也可以

    目录 简介 DOM操作 CSS操作 处理事件 总结 简介 虽然dart可以同时用作客户端和服务器端,但是基本上dart还是用做flutter开发的基本语言而使用的.除了andorid和ios之外,we ...

  7. dart系列之:你的地盘你做主,使用Extension对类进行扩展

    目录 简介 dart中extension的使用 API冲突 extention的实现 总结 简介 一般情况要扩展一个类,需要继承这个类,这是在大多数java或者其他面向对象语言中要做的事情. 但是有些 ...

  8. dart系列之:dart代码最佳实践

    目录 简介 命名规则 import中的顺序 格式化 总结 简介 每种语言都有自己的代码风格,这种代码风格是跟语言特性息息相关的.如果在编码的过程中遵循这种统一的编码规则,会给我们的业务带来非常多的便利 ...

  9. dart系列之:手写Library,Library编写最佳实践

    目录 简介 使用part和part of src中的文件 package中的lib文件 总结 简介 Library是dart用来组织代码的一种非常有用的方式,通过定义不同的Library,可以将非常有 ...

随机推荐

  1. Django对表单进行增删改查

    查 首先在url中写好路径 其次在后面参数的views里写函数类xxxxxxx的基本逻辑 定义一个函数xxxxxxx,继承request,注意这个request对数据库操作结果都会存放在request ...

  2. python filter lambda 的使用

    lambda 匿名函数的使用 >>> a=lambda x : x in "1234567890.," >>> a("asd" ...

  3. Less-25 preg_replace2

    Less-25: 核心语句: 各种回显也均有. 通过blacklist,我们可以发现,本题屏蔽了and和or. preg_replace函数中正则表达式后面的i是一个修饰符,代表正则匹配时不区分大小写 ...

  4. Microsoft Porject Online 学习随手记一:环境创建和数据导入

    没有想像的简单,也没那么复杂 Project OL之前是Dynamics 365 Enterprise P1中的一个模块,目前最新版本只能简单创建并且已经没有Enterprise P1选项. 主要流程 ...

  5. 深入浅出Java内存模型

    面试官:我记得上一次已经问过了为什么要有Java内存模型 面试官:我记得你的最终答案是:Java为了屏蔽硬件和操作系统访问内存的各种差异,提出了「Java内存模型」的规范,保证了Java程序在各种平台 ...

  6. 第1次 Beta Scrum Meeting

    本次会议为Beta阶段第1次Scrum Meeting会议 会议概要 会议时间:2021年5月29日 会议地点:「腾讯会议」线上进行 会议时长:0.5小时 会议内容简介:本次会议为Beta阶段第1次会 ...

  7. SpringCloud+RocketMQ实现分布式事务

    随着互联网公司的微服务越来越多,分布式事务已经成为了我们的经常使用的.所以我们来一步一步的实现基于RocketMQ的分布式事务.接下来,我们将要做的主题写出来. RocketMQ的分布式事务结构和说明 ...

  8. WebGL着色器渲染小游戏实战

    项目起因 经过对 GLSL 的了解,以及 shadertoy 上各种项目的洗礼,现在开发简单交互图形应该不是一个怎么困难的问题了.下面开始来对一些已有业务逻辑的项目做GLSL渲染器替换开发. 起因是看 ...

  9. OKhttp3的使用教程

    首先在build.gradle下的dependencies下添加引用. implementation "com.squareup.okhttp3:okhttp:4.9.0" 然后编 ...

  10. Codeforces Round #744 (Div. 3) G题题解

    淦,最后一道题没写出来,...还是我太菜了,不过这个题确实比较有趣. G. Minimal Coverage 简化题意:就是你处在坐标轴的0点上,给你一个序列\(a_i\),每次你可以选择向左走\(a ...