當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。