flutter-EventBus
2022-08-05 本文已影响0人
ChaosHeart
flutter 3.0.4
///定义一个top-level(全局)变量,页面引入该文件后可以直接使用bus
var eBus = EventBus();
//订阅者回调签名
typedef EventCallback = void Function(dynamic arg);
///事件总线
class EventBus {
// 工厂方法构造函数 - 通过UserModel()获取对象1
factory EventBus() => _getInstance();
// instance的getter方法 - 通过UserModel.instance获取对象2
static EventBus get instance => _getInstance();
// 静态变量_instance,存储唯一对象
static EventBus? _instance;
// 获取唯一对象
static EventBus _getInstance() {
_instance ??= EventBus._internal();
return _instance!;
}
//初始化...
EventBus._internal() {
//初始化其他操作...
}
///以上为单例...
//保存事件订阅者队列,key:事件名(id),value: 对应事件的订阅者队列
final _map = <Object, List<EventCallback>>{};
///添加订阅者-接收事件
void on(eventName, EventCallback f) {
if (eventName == null) return;
_map[eventName] ??= <EventCallback>[];
_map[eventName]?.add(f);
}
///移除订阅者-结束事件
void off(eventName, EventCallback f) {
var list = _map[eventName];
if (eventName == null || list == null) return;
list.remove(f);
}
///已加订阅者-发送事件
void emit(eventName, [arg]) {
var list = _map[eventName];
if (list == null) return;
int len = list.length - 1;
//反向遍历,防止在订阅者在回调中移除自身带来的下标错位
for (var i = len; i > -1; --i) {
list[i](arg);
}
}
}