我想创建一个可以向每个订户散发一个值的流,无论何时订阅。
谨慎地,以下代码应在42
之前打印两个
done
,但是给定的方法都不起作用。
void main() async {
final stream = createStream(42);
stream.listen(printValue);
await Future.delayed(Duration(seconds: 1));
stream.listen(printValue);
// Wait for everything to finish.
await Future.delayed(Duration(seconds: 1));
print('done');
}
Stream<int> createStream(int val) {
// Error: Stream has already been listened to.
// return Stream.value(val);
// Only gets one output
return Stream.value(val).asBroadcastStream();
}
void printValue(int val) {
print(val);
}
既定的输出:
42
42
done
但
Stream.value()
生成错误
Stream has already been listened to.
。 .asBroadcastStream()
给出了错误的结果。
注:使用RXDART的答案将受到欢迎。
您可以使用多订阅标准流来实现所需的输出:
控制台输出在下面列出:
$ dart main.dart
42
42
done
注:创建多订阅标准流的另一种简便方法是使用工厂构造函数
Stream.fromIterable
:
/// Returns a multi-subscription stream that yields only `val`.
Stream<int> createStream(int val) => Stream.fromIterable([val]);