You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建向所有订阅者发送单一常量值的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 13:38:26