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 Stream.map用法及代碼示例
- Dart Stream.fromFutures用法及代碼示例
- Dart Stream.fold用法及代碼示例
- 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.distinct用法及代碼示例
- Dart Stream.timeout用法及代碼示例
- Dart Stream.transform用法及代碼示例
- Dart Stream.singleWhere用法及代碼示例
- Dart Stream.fromFuture用法及代碼示例
- Dart Stream.skipWhile用法及代碼示例
- Dart Stream.skip用法及代碼示例
注:本文由純淨天空篩選整理自dart.dev大神的英文原創作品 Stream<T>.multi constructor。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。