代码拉取完成,页面将自动刷新
/**
* developer: yeganaaa@163.com
* time: 2018-10-04 17:37:05 GMT+6.0
*/
/**
* Event Bus
*/
class EventBus {
List<int> _idTable = [];
Map<String, Map<int, Function>> _events = {};
EventBus();
static Map<String, EventBus> _cache = {};
/**
* Create an EventBus singleton instance
*/
factory EventBus.singleton({String key = ""}){
if (!_cache.containsKey(key)) _cache[key] = EventBus();
return _cache[key];
}
/**
* Subscribe an event handler,
*/
int subscribe<DATA>(String addr, void handler(EventBus bus, DATA data)){
var allocatedId = 0; //allocate an event id
while (_idTable.any((id) => id == allocatedId)){
allocatedId++;
}
var eventGroup = _events[addr];
if (eventGroup == null){
eventGroup = {};
_events[addr] = eventGroup;
}
eventGroup[allocatedId] = handler;
_idTable.add(allocatedId); //add event id to id_table.
return allocatedId;
}
/**
* Subscribe an event handler if not exists.
*/
int subscribeIfNotExists<DATA>(String addr, void handler(EventBus bus, DATA data)){
var allocatedId = -1;
var eventGroup = _events[addr];
if (eventGroup == null) {
eventGroup = {};
_events[addr] = eventGroup;
}
if (eventGroup.isEmpty){
allocatedId = subscribe(addr, handler);
}
return allocatedId;
}
/**
* UnSubscribe an event handler is exists.
*/
bool unSubscribe(int eventId){
var contains = false;
_events.forEach((key, value) {
if (contains) return;
contains = value[eventId] != null;
if (contains){
value.remove(eventId);
_idTable.remove(eventId);
}
});
return contains;
}
/**
* Subscribe an once event handler
*/
void subscribeOnce<DATA>(String addr, void handler(EventBus bus, DATA data)){
var eventId = subscribe(addr, handler);
var trackerEventId = 0;
trackerEventId = subscribe(addr, (bus, _){
bus.unSubscribe(trackerEventId);
bus.unSubscribe(eventId);
});
}
/**
* Publish an message to any handlers of this address
*/
DATA publish<DATA>(String addr, DATA data){
var eventGroup = _events[addr] ?? {};
eventGroup.map((key, value) => MapEntry(key, value)).forEach((id, event){
event(this, data);
});
return data;
}
/**
* Unsubscribe all handlers of this address
*/
void unSubscribeAll(String addr){
var eventGroup = _events[addr] ?? {};
eventGroup.map((key, value) => MapEntry(key, value)).forEach((id, event){
_idTable.remove(id);
});
eventGroup.clear();
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。