当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Dart Stream用法及代码示例


dart:async 库中Stream 类的用法介绍如下。

异步数据事件的来源。

Stream 提供了一种接收一系列事件的方法。每个事件或者是一个数据事件,也称为流的element,或者是一个错误事件,它是某事失败的通知。当一个流已经发出它的所有事件时,一个单一的"done" 事件会通知监听器已经到达终点。

您可以通过调用async* 函数来生成流,然后该函数返回一个流。使用该流将导致函数发出事件,直到它结束,并且流关闭。您可以使用 await for 循环(可在 asyncasync* 函数内使用)或通过在 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 在非广播流之上创建广播流。

在任一类型的流上,流转换(例如 whereskip )返回与调用该方法的流类型相同的流,除非另有说明。

当触发事件时,当时的侦听器将接收到该事件。如果在触发事件时将侦听器添加到广播流,则该侦听器将不会接收当前正在触发的事件。如果一个监听器被取消,它会立即停止接收事件。监听广播流可被视为监听新流,该流仅包含在 listen 调用发生时尚未发出的事件。例如,first getter 侦听流,然后返回侦听器接收到的第一个事件。这不一定是流发出的第一个,而是广播流的 remaining 事件中的第一个。

当"done" 事件被触发时,订阅者在接收到事件之前被取消订阅。发送事件后,流没有订阅者。在此之后允许向广播流添加新订阅者,但他们只会尽快收到新的 "done" 事件。

流订阅始终尊重"pause" 请求。如有必要,他们需要缓冲他们的输入,但通常,最好他们也可以简单地请求他们的输入暂停。

isBroadcast 的默认实现返回 false。从Stream 继承的广播流必须覆盖isBroadcast 以返回true,如果它想发出信号表明它的行为类似于广播流。


实施者

CustomStream ElementStream HttpClientResponse HttpRequest HttpServer RawDatagramSocket RawSecureServerSocket RawServerSocket RawSocket ReceivePort SecureServerSocket ServerSocket Socket Stdin StreamView WebSocket

相关用法


注:本文由纯净天空筛选整理自dart.dev大神的英文原创作品 Stream<T> class。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。