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


Dart Stream.asBroadcastStream用法及代码示例


dart:async 库中Stream.asBroadcastStream 方法的用法介绍如下。

用法:

Stream<T> asBroadcastStream(
   {void onListen(
   StreamSubscription<T> subscription   
)?,    
   void onCancel(
   StreamSubscription<T> subscription   
)?}   
)

返回产生与此相同事件的multi-subscription 流。

返回的流将在添加第一个订阅者时订阅此流,并将保持订阅状态,直到此流结束或回调取消订阅。

如果提供了onListen,则使用subscription-like 对象调用它,该对象表示对该流的基础订阅。在调用 onListen 期间可以暂停、恢复或取消订阅。无法更改事件处理程序,包括使用 StreamSubscription.asFuture

如果提供了onCancel,则在返回的流停止具有侦听器时以与onListen 类似的方式调用它。如果它稍后获得新的侦听器,则再次调用 onListen 函数。

使用回调,例如,在没有订阅者时暂停底层订阅以防止丢失事件,或者在没有侦听器时取消订阅。

取消旨在在没有当前订阅者时使用。如果传递给 onListenonCancel 的订阅被取消,则当前订阅不会在返回的广播流上发出更多事件,甚至不会发出 done 事件。

例子:

final stream =
    Stream<int>.periodic(const Duration(seconds: 1), (count) => count)
        .take(10);

final broadcastStream = stream.asBroadcastStream(
  onCancel: (controller) {
    print('Stream paused');
    controller.pause();
  },
  onListen: (controller) async {
    if (controller.isPaused) {
      print('Stream resumed');
      controller.resume();
    }
  },
);

final oddNumberStream = broadcastStream.where((event) => event.isOdd);
final oddNumberListener = oddNumberStream.listen(
      (event) {
    print('Odd: $event');
  },
  onDone: () => print('Done'),
);

final evenNumberStream = broadcastStream.where((event) => event.isEven);
final evenNumberListener = evenNumberStream.listen((event) {
  print('Even: $event');
}, onDone: () => print('Done'));

await Future.delayed(const Duration(milliseconds: 3500)); // 3.5 second
// Outputs:
// Even: 0
// Odd: 1
// Even: 2
oddNumberListener.cancel(); // Nothing printed.
evenNumberListener.cancel(); // "Stream paused"
await Future.delayed(const Duration(seconds: 2));
print(await broadcastStream.first); // "Stream resumed"
// Outputs:
// 3

相关用法


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