单订阅流与广播流
为多个监听者选择合适的流
单订阅流与广播流 是 CoddyKit 上的免费 Dart Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Dart Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Dart Academy 课程共包含 4 节课。
两种流
Dart 流分为两种:单订阅流和广播流。选择哪一种,取决于您需要多少个监听器。
单订阅流
单订阅流在其整个生命周期内只允许一个监听器。它是默认类型,非常适合只执行一次的序列,例如读取文件。📄
只能监听一次
如果尝试两次监听单订阅流,Dart 会抛出StateError。该流会记住自己已经拥有唯一的监听器。
final s = Stream.fromIterable([1, 2]);
s.listen(print);
s.listen(print); // throws StateError监听前会缓冲
单订阅流会耐心等待。在开始监听之前,它不会产生事件,因此不会遗漏任何值。
广播流
broadcast流允许多个监听器同时订阅。每个处于活动状态的监听器都会收到它发出的相同事件。📡
转换为广播流
调用asBroadcastStream,即可将单订阅流转换为共享流。这样就可以有多个监听器连接到它。
final shared = source.asBroadcastStream();
shared.listen(print);
shared.listen((v) => log(v));较晚的监听器会错过事件
广播流不会缓冲事件。较晚订阅的监听器只能看到从订阅时刻起发出的事件,看不到之前的事件。
控制器决定流的类型
StreamController默认创建单订阅流。如果需要多个监听器,请改用广播构造函数。
final ctrl = StreamController<int>.broadcast();
ctrl.stream.listen(print);何时使用单订阅流
当数据只流向一个使用者一次时,请使用单订阅流,例如网络响应的字节或文件读取内容。
何时使用广播流
对于应用中多个部分都关注的持续事件,请选择broadcast流,例如按钮点击或实时传感器更新。
监听前先检查
不确定自己拥有哪种类型的流?isBroadcast属性会告诉您答案,让您可以避免对单订阅流重复监听时出现 StateError。
if (!stream.isBroadcast) {
// only one listener allowed
}快速检查
哪种流适合多个监听器?
回顾
单订阅流服务于一个监听器,并会在读取前进行缓冲;广播流服务于多个监听器,但会跳过已经发出的事件。请根据监听器数量进行选择。🎉
常见问题解答
「单订阅流与广播流」课时是免费的吗?
是的 — 「单订阅流与广播流」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Dart Academy 课程的其余内容,请升级到 CoddyKit PRO。 Dart Academy 课程共包含 4 节课。
「单订阅流与广播流」这节课中我会学到什么?
为多个监听者选择合适的流 你通过在浏览器中直接运行的动手代码来练习 Dart Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Dart Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Dart Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。
「单订阅流与广播流」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Dart Academy 课中编写并运行代码吗?
能。每节 Dart Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。