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
函數。
使用回調,例如,在沒有訂閱者時暫停底層訂閱以防止丟失事件,或者在沒有偵聽器時取消訂閱。
取消旨在在沒有當前訂閱者時使用。如果傳遞給 onListen
或 onCancel
的訂閱被取消,則當前訂閱不會在返回的廣播流上發出更多事件,甚至不會發出 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 Stream.any用法及代碼示例
- Dart Stream.fromFutures用法及代碼示例
- Dart Stream.fold用法及代碼示例
- Dart Stream.map用法及代碼示例
- 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.multi用法及代碼示例
- Dart Stream.distinct用法及代碼示例
- Dart Stream.timeout用法及代碼示例
- Dart Stream.transform用法及代碼示例
- Dart Stream.singleWhere用法及代碼示例
- Dart Stream.fromFuture用法及代碼示例
- Dart Stream.skipWhile用法及代碼示例
注:本文由純淨天空篩選整理自dart.dev大神的英文原創作品 asBroadcastStream method。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。