Dart Stream 的 2 种类型

Dart Stream 的 2 种类型

Single-Subscription Stream 单订阅流

  • 是默认的 Stream 类型,只能被一个监听器订阅(多次订阅会抛出异常,即使取消后也无法重复订阅)
  • 适用于一对一的异步事件处理,事件需要按顺序提供并且不能丢失
  • 适用于网络请求、文件读取等场景
dart 复制代码
Stream<int> myStream = Stream.value(42);
//
Stream<int> iterableStream = Stream.fromIterable([1, 2, 3, 4, 5]);
//
StreamController<int> streamController = StreamController();
Stream<int> dataStream = streamController.stream;
dart 复制代码
dataStream.listen(
  (data) => print("Received: $data"), //数据回调
  onError: (error) => print("Error: $error"), //错误回调(可选)
  onDone: () => print("Stream completed"), //完成回调(可选)
);

Broadcast Stream 广播流

  • 允许多个监听器同时订阅,数据会广播给所有订阅者
  • 适用于一对多的事件广播场景,即使没有监听者,事件也仍会被发送,不再使用后需要手动关闭
  • 适用于用户登录状态变化(状态广播)、传感器数据监听等场景
  • 局限性:不能保留已发送的事件(新的订阅者无法收到旧的已发送的时间)

利用 asBroadcastStream 将单订阅 Stream 转换为广播 Stream

dart 复制代码
Stream<int> singleStream = Stream.periodic(const Duration(seconds: 1), (count) => count);
Stream<int> broadcastStream = singleStream.asBroadcastStream();

使用 StreamController.broadcast 直接创建广播 Stream

dart 复制代码
StreamController<int> controller = StreamController.broadcast();
Stream<int> broadcastStream = controller.stream;
dart 复制代码
broadcastStream.listen(
  (data) => print("Listener 1: $data"),
);

broadcastStream.listen(
  (data) => print("Listener 2: $data"),
);
相关推荐
brycegao2 天前
Flutter Dart JSON 解析必坑!金额精度丢失为什么必须在网络层处理?附工业级解决方案
flutter·dart
我有满天星辰5 天前
【Dart 语言学习教程 】 第二章:面向对象编程
学习·flutter·dart
韩曙亮6 天前
【Flutter】Dart 单例 ( 单例模式核心规则 | 饿汉式单例 | 懒汉式单例 | 极简空安全 懒汉式单例 | 工厂构造函数单例 )
flutter·单例模式·dart·饿汉式单例·懒汉式单例·空安全·空赋值
程序员老刘13 天前
Dart 3.12 更新要点:乏善可陈
flutter·ai编程·dart
Flynt15 天前
升级Flutter 3.44,我踩了HCPP和AGP 9的坑
android·flutter·dart
雪芽蓝域zzs23 天前
(一)Dart 环境搭建 以及开发工具配置
dart
我命由我123451 个月前
Dart - Dart SDK、Hello World 案例、变量声明、常量声明、常量 final、字符串类型
前端·flutter·前端框架·html·web·dart·web app
MonkeyKing1 个月前
Flutter列表性能极致优化:从卡顿到丝滑
flutter·dart
xiaoyan20151 个月前
2026爆肝!Flutter3.41纯手撸微信聊天APP原生应用
android·flutter·dart
MonkeyKing2 个月前
三棵树彻底拆解(Widget / Element / RenderObject)
flutter·dart