Flutter 事件总线

      很多语言都有广播的概念,比如iOS 和 安卓 或者flutter中, 因为在APP中,我们通常会需要广播机制,用以跨页面事件通知,比如一个需要登录的APP中,页面会关注用户登录或注销事件,来进行一些状态更新。这时候,一个事件总线便会非常有用,事件总线通常实现了订阅者模式,订阅者模式包含发布者和订阅者两种角色,可以通过事件总线来触发事件和监听事件,本节我们实现一个简单的全局事件总线,我们使用单例模式,代码如下:

typedef BroadcastEventsCallBack<T> = void Function(T event);

class BroadcastEventsManager<T extends EventPublisher> {
/// 内部构造方法
BroadcastEventsManager._();

static BroadcastEventsManager _instance;

/// 实现工厂构造方法 目的实现单列效果
factory BroadcastEventsManager() => _instance ??= BroadcastEventsManager._();

/// 事件总线集合
Map _streamMap = Map<String, BroadcastEventsStream>();

/// 获取type类型
Type _typeOf<T>() => T;

/// 获取索引key
String _key<T>({String tag}) {
return _typeOf<T>().toString() + (tag ?? '');
}

/// 添加广播事件
void add<T extends EventPublisher>(BroadcastEventsCallBack<T> callBack,
{String tag, bool sync = false}) {
BroadcastEventsStream busStream;
String key = _key<T>(tag: tag);

if (_streamMap.containsKey(key)) {
busStream = _streamMap[key];
} else {
busStream = BroadcastEventsStream(sync: sync);
_streamMap[key] = busStream;
}

/// 流事件监听
busStream.add<T>().listen(callBack);
}

/// 移除广播事件
void off<T extends EventPublisher>({String tag}) {
String key = _key<T>(tag: tag);

if (_streamMap.containsKey(key)) {
_streamMap[key].destroy();
_streamMap.remove(key);
}
}

/// 执行广播事件
void post<T extends EventPublisher>(T event, {String tag}) {
String key = _key<T>(tag: tag);

if (_streamMap.containsKey(key)) {
_streamMap[key].post(event);
}
}
}

    /// 添加git链接https://github.com/LIXIANGXLee/broadcast_events.git;

posted @ 2020-04-09 18:02  小鱼的市场  阅读(582)  评论(0编辑  收藏  举报