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 有什么区别?

▲Dart-‘dart:async’库

如何从 JavaScript 监听器创建 Dart Stream

在 Dart / Flutter 的 Firestore 查询中添加限制时,不会调用 Stream Listen

Dart 流中的 listen 和 forEach 有啥区别?

Flutter 中的 Sink 和 Stream 有啥区别?