Dart中的Stream初步研究
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dart中的Stream初步研究相关的知识,希望对你有一定的参考价值。
参考技术A Stream 是一些列异步事件的序列。① 使用异步 for 循环
② 使用 stream 的 listen 来监听
① 单订阅 stream ( Single-Subscription )
只包含一个事件序列,事件需要按顺序提供,不能丢失。比如读取一个文件,接收一个网页。
② 广播 stream ( Broadcast )
针对单个消息的,一次处理一个消息。比如浏览器的鼠标事件。
可以在任何时候监听,可以添加多个监听,还可以随时取消监听。
修改 stream 会产生一个新的 stream ,在原来 stream 上添加的监听,会转到新的 stream 上,如果新的 stream 结束了,会转到原来的 stream 上。
详细参考文章: Flutter Stream简介及部分操作符使用
① 从其他 stream 转换
以上提到的修改 stream 的方法
② 使用异步生成器( async* )生成 stream
③ 使用 StreamController 来创建
比如, event_bus 的实现,使用广播 stream
① event_bus 插件的使用
相关文章: Flutter EventBus 的使用和底层实现分析
② Bloc 插件的使用
③ StreamBuilder 组件
① await 用于等待异步方法返回数据
② async 用于异步方法
③ sync* 多元素同步函数生成器,返回 Iterable<T>
④ async* 多元素异步函数生成器,返回 Stream<T>
⑤ yield 发送的是一个元素
⑥ yield* 操作的是一个 Iterable 或 Stream
具体使用例子,如下:
如何从 JavaScript 监听器创建 Dart Stream
【中文标题】如何从 JavaScript 监听器创建 Dart Stream【英文标题】:How to create a Dart Stream from a JavaScript listener 【发布时间】:2013-12-23 00:25:25 【问题描述】:我想创建一个 Stream,它应该包含与以下代码中的回调相同的元素:
chromeTabs['onUpdated'].callMethod('addListener',
[(tabId, changeInfo, tab) => print("tabId = $tabId")]);
我阅读了 Chris Buckett 的教程/文章,但不确定是否可以在第一个 Consumer 到来时创建 Stream 元素。在上面的代码中,这意味着当 Dart Stream 被监听时注册 javascript 监听器。
由于在初始化之前引用了 updateStreamController,以下代码无法运行:
var updateStreamController = new StreamController<int>(onListen: () =>
chromeTabs['onUpdated'].callMethod('addListener', [(tabId, changeInfo, tab) =>
updateStreamController.add(tabId)]);`
很遗憾,onListen 属性只能通过构造函数设置。
提前感谢您的帮助
【问题讨论】:
【参考方案1】:您可以在初始化之前简单地声明变量:
var updateStreamController;
updateStreamController = new StreamController<int>(onListen: () =>
chromeTabs['onUpdated'].callMethod('addListener',
[(tabId, changeInfo, tab) => updateStreamController.add(tabId)]));
【讨论】:
以上是关于Dart中的Stream初步研究的主要内容,如果未能解决你的问题,请参考以下文章
Dart 流中的 listen 和 forEach 有什么区别?
如何从 JavaScript 监听器创建 Dart Stream
在 Dart / Flutter 的 Firestore 查询中添加限制时,不会调用 Stream Listen