具体代码如下
class Emitter {
Map events = {};
emit(String event, [dynamic data]) {
if (event.isEmpty) {
return;
}
if (events[event] is List) {
for (Function fn in events[event]) {
// KLogUtil.d("data $data fn $fn");
fn(data ?? "");
// fn.call(data ?? "");
}
}
return this;
}
on(String event, Function fn) {
if (events[event] is List) {
events[event].add(fn);
} else {
events[event] = [fn];
}
return this;
}
off(String event, Function fn) {
if (event.isNotEmpty) {
List? listeners = events[event];
if (listeners != null) {
listeners.removeWhere((element) => element == fn);
} else {
events[event] = [];
}
}
return this;
}
}
触发事件
ImManager.events.emit(SelfCbEvents.updateContacts, 1);
ImManager.events.emit(SelfCbEvents.updateUserInfoPage);
第一个参数为触发的事件名字 和on绑定的事件名一样
第二个参数 为绑定事件名 传递的参数
绑定事件
ImManager.events.on(IMConstCbEvents.ONNEWCONVERSATION, newConversation);
newConversation(data) { // 注意回调函数必须要写参数接收 同时 回调函数不能为_开头的私有方法
}
卸载事件
ImManager.events.off(IMConstCbEvents.ONNEWCONVERSATION, newConversation);
说明
ImManager.events 就是挂载的 Emitter实例对象
IMConstCbEvents 是自定义的一个事件实体类 IMConstCbEvents.ONNEWCONVERSATION 本质传递的是字符串
如:
///自定义EventBus事件
class SelfCbEvents {
static const groupNewConversation = "GroupNewConversation";
// 更新通讯录信息
static const updateContacts = "updateContacts";
// 更新实时更新用户详情页
static const updateUserInfoPage = "updateUserInfoPage";
}