dart:async
库中Stream
类的用法介绍如下。
异步数据事件的来源。
Stream 提供了一种接收一系列事件的方法。每个事件或者是一个数据事件,也称为流的element
,或者是一个错误事件,它是某事失败的通知。当一个流已经发出它的所有事件时,一个单一的"done" 事件会通知监听器已经到达终点。
您可以通过调用async*
函数来生成流,然后该函数返回一个流。使用该流将导致函数发出事件,直到它结束,并且流关闭。您可以使用 await for
循环(可在 async
或 async*
函数内使用)或通过在 async*
函数内使用 yield*
直接转发其事件来使用流。例子:
Stream<T> optionalMap<T>(
Stream<T> source , [T Function(T)? convert]) async* {
if (convert == null) {
yield* source;
} else {
await for (var event in source) {
yield convert(event);
}
}
}
调用此函数时,它会立即返回一个Stream<T>
对象。然后在有人尝试使用该流之前不会再发生任何事情。此时,async*
函数的主体开始运行。如果省略convert
函数,yield*
将侦听source
流并将所有事件、日期和错误转发到返回的流。当source
流关闭时,yield*
完成,optionalMap
函数体也结束。这将关闭返回的流。如果提供了convert
is
,则该函数将侦听源流并进入重复等待下一个数据事件的await for
循环。在数据事件上,它使用该值调用convert
,并在返回的流上发出结果。如果source
流没有发出错误事件,则循环在source
流发出时结束,然后optionalMap
函数体完成,从而关闭返回的流。在来自source
流的错误事件中,await for
重新抛出该错误,从而中断循环。然后错误到达optionalMap
函数体的末尾,因为它没有被捕获。这使得错误在返回的流上发出,然后关闭。
Stream
类还提供允许您手动侦听来自流的事件,或将流转换为另一个流或未来的函数。
forEach 函数对应于await for
循环,就像Iterable.forEach 对应于普通的for
/in
循环一样。像循环一样,它会为每个数据事件调用一个函数并在错误时中断。
更底层的listen 方法是所有其他方法的基础。您在流上调用 listen
以告诉它您想要接收事件,并注册将接收这些事件的回调。当您调用 listen
时,您会收到一个 StreamSubscription 对象,该对象是提供事件的活动对象,可用于再次停止侦听或暂时暂停订阅中的事件。
有两种流:"Single-subscription" 流和"broadcast" 流。
A single-subscription stream
在流的整个生命周期内只允许一个侦听器。它在拥有监听器之前不会开始生成事件,并且当监听器被取消订阅时它会停止发送事件,即使事件源仍然可以提供更多。 async*
函数创建的流是single-subscription 流,但每次调用该函数都会创建一个新的此类流。
不允许在 single-subscription 流上收听两次,即使在第一次订阅已被取消后也是如此。
Single-subscription 流通常用于流式传输较大的连续数据块,例如文件 I/O。
A broadcast stream
允许任意数量的侦听器,并在它们准备好时触发其事件,无论是否有侦听器。
广播流用于独立事件/观察者。
如果多个听众想要收听single-subscription 流,请使用asBroadcastStream 在非广播流之上创建广播流。
在任一类型的流上,流转换(例如 where 和 skip )返回与调用该方法的流类型相同的流,除非另有说明。
当触发事件时,当时的侦听器将接收到该事件。如果在触发事件时将侦听器添加到广播流,则该侦听器将不会接收当前正在触发的事件。如果一个监听器被取消,它会立即停止接收事件。监听广播流可被视为监听新流,该流仅包含在 listen 调用发生时尚未发出的事件。例如,first getter 侦听流,然后返回侦听器接收到的第一个事件。这不一定是流发出的第一个,而是广播流的 remaining
事件中的第一个。
当"done" 事件被触发时,订阅者在接收到事件之前被取消订阅。发送事件后,流没有订阅者。在此之后允许向广播流添加新订阅者,但他们只会尽快收到新的 "done" 事件。
流订阅始终尊重"pause" 请求。如有必要,他们需要缓冲他们的输入,但通常,最好他们也可以简单地请求他们的输入暂停。
isBroadcast 的默认实现返回 false。从Stream 继承的广播流必须覆盖isBroadcast 以返回true
,如果它想发出信号表明它的行为类似于广播流。
相关用法
- Dart StreamTransformer构造函数用法及代码示例
- Dart Stream.fromFutures用法及代码示例
- Dart StreamController用法及代码示例
- Dart Stream.fold用法及代码示例
- Dart Stream.map用法及代码示例
- Dart StreamSubscription用法及代码示例
- Dart Stream.asBroadcastStream用法及代码示例
- Dart Stream.handleError用法及代码示例
- Dart Stream.where用法及代码示例
- Dart Stream.reduce用法及代码示例
- Dart Stream.join用法及代码示例
- Dart Stream.error用法及代码示例
- Dart Stream.periodic用法及代码示例
- Dart Stream.take用法及代码示例
- Dart Stream.every用法及代码示例
- Dart Stream.lastWhere用法及代码示例
- Dart Stream.contains用法及代码示例
- Dart Stream.eventTransformed用法及代码示例
- Dart Stream.firstWhere用法及代码示例
- Dart Stream.drain用法及代码示例
- Dart Stream.empty用法及代码示例
- Dart Stream.multi用法及代码示例
- Dart Stream.distinct用法及代码示例
- Dart Stream.timeout用法及代码示例
- Dart Stream.transform用法及代码示例
注:本文由纯净天空筛选整理自dart.dev大神的英文原创作品 Stream<T> class。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。