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


Dart Stream.multi用法及代码示例


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

用法:

@Since("2.9")   

Stream<T>.multi(
   void onListen(
   MultiStreamController<T>   
),    
   {bool isBroadcast = false}   
)

创建 multi-subscription 流。

每次侦听创建的流时,都会使用新的 MultiStreamController 调用 onListen 回调,该回调将事件转发到该 listen 调用返回的 StreamSubscription

这允许将每个侦听器视为单独的流。

MultiStreamController 不支持读取其 StreamController.stream 。设置它的StreamController.onListen 无效,因为调用的是onListen 回调,并且以后不会调用StreamController.onListen。控制器的作用类似于异步控制器,但提供了同步传递事件的额外方法。

如果 isBroadcast 设置为 true ,则返回的流的 Stream.isBroadcast 将为 true 。这对流行为没有影响,如果 onListen 函数声称自己是广播流,则它可以像广播流一样工作。

multi-subscription 流可以像任何其他流一样运行。如果 onListen 回调在第一次调用之后的每个调用中都抛出,则流的行为类似于 single-subscription 流。如果流向所有当前侦听器发出相同的事件,则它的行为类似于广播流。

它还可以选择向不同的侦听器发出不同的事件。例如,将最近的非 null 事件重复给新侦听器的流可以实现为以下示例:

extension StreamRepeatLatestExtension<T extends Object> on Stream<T> {
  Stream<T> repeatLatest() {
    var done = false;
    T? latest = null;
    var currentListeners = <MultiStreamController<T>>{};
    this.listen((event) {
      latest = event;
      for (var listener in [...currentListeners]) listener.addSync(event);
    }, onError: (Object error, StackTrace stack) {
      for (var listener in [...currentListeners]) listener.addErrorSync(error, stack);
    }, onDone: () {
      done = true;
      latest = null;
      for (var listener in currentListeners) listener.closeSync();
      currentListeners.clear();
    });
    return Stream.multi((controller) {
      if (done) {
        controller.close();
        return;
      }
      currentListeners.add(controller);
      var latestValue = latest;
      if (latestValue != null) controller.add(latestValue);
      controller.onCancel = () {
        currentListeners.remove(controller);
      };
    });
  }
}

相关用法


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