如何创建向所有订阅者发送单一常量值的Dart Stream?
解决Dart Stream多次订阅均接收单一值的问题
你需要实现一个Stream,让任何时候订阅它的订阅者都能收到指定的单一值。原代码的两种实现都无法满足需求:
Stream.value()是单订阅流,多次调用listen会直接抛出Stream has already been listened to错误;- 转换为广播流后,第一次订阅会触发原冷流发射值并结束,第二次订阅时流已完成,因此无法收到值。
基于RxDart的解决方案
使用RxDart中的BehaviorSubject可以完美解决这个问题——它会保存最近一次发射的值,并且在新订阅者订阅时立即将该值推送给对方。
步骤1:添加RxDart依赖
在项目的pubspec.yaml中添加RxDart依赖:
dependencies: rxdart: ^0.27.7
步骤2:修改代码实现
import 'package:rxdart/rxdart.dart'; void main() async { final stream = createStream(42); stream.listen(printValue); await Future.delayed(Duration(seconds: 1)); stream.listen(printValue); await Future.delayed(Duration(seconds: 1)); print('done'); } Stream<int> createStream(int val) { // 创建一个预填充了目标值的BehaviorSubject final subject = BehaviorSubject<int>.seeded(val); // 返回subject的stream供外部订阅 return subject.stream; } void printValue(int val) { print(val); }
运行这段代码会输出:
42 42 done
纯Dart替代方案(无需RxDart)
如果不想引入RxDart依赖,可以使用Stream.multi创建一个为每个订阅者单独发射值的流:
Stream<int> createStream(int val) { return Stream.multi((controller) { controller.add(val); controller.close(); }); }
Stream.multi会为每个新订阅者创建独立的控制器实例,因此每次订阅都会触发add(val)操作,同样能满足需求。
内容的提问来源于stack exchange,提问作者ph3rin
相关产品推荐
相关产品推荐

