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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。