











event_bus 的底层就是 Dart 自带的 dart:async:用 Stream + StreamController 做“事件流”,没有用别的黑科技
StreamController.broadcast_streamController = StreamController.broadcast(sync: sync);
StreamController 只允许一个 listener)。false(默认):事件在本次 fire() 返回之后、在后续的 microtask 里再分发给监听者(异步)。true:在 fire() 调用时立刻同步把事件交给所有监听者。所以 event_bus 的“总线”本质上就是:一个广播型的 StreamController。
fire(event) → streamController.add(event)void fire(event) {
streamController.add(event);
}
就是把事件对象放进这条流里,所有正在监听这条流的人都会收到(在 broadcast 下)。
on<T>() → 对 stream 做 where + castStream<T> on<T>() {
if (T == dynamic) {
return streamController.stream as Stream<T>;
} else {
return streamController.stream.where((event) => event is T).cast<T>();
}
}
streamController.stream。where((event) => event is T):只保留类型为 T(或子类)的事件。.cast<T>():把 Stream 转成 Stream<T>,方便监听方拿到的就是 T。所以“按事件类型监听”没有用反射或代码生成,就是 Stream 的过滤 + 类型转换。
| 概念 | 底层技术 |
|---|---|
| 事件通道 | StreamController.broadcast() 产生的一条 Stream |
| 发事件 | StreamController.add(event),即往流里塞数据 |
| 收事件 | 对这条流 listen,即 Dart 的 Stream 订阅 |
| 按类型收 | 对同一条流做 where((e) => e is T).cast<T>() |
所以 event_bus 的底层技术就是:Dart 的 Stream + StreamController.broadcast + 按类型过滤,没有额外依赖,也没有用到 Native 或平台特有 API。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。