背景
项目开发过程中,有些场景,需要跨页面进行数据传递。按照安卓开发的思路,在flutter实现一个事件总线EventBus,进行数据传递
原理
通过dart的签名函数,进行监听集合设置,然后post分发的时候,进行集合遍历,回调,实现事件传递。
实现过程
总体思路,就是通过一个订阅,取消订阅,遍历订阅对象,进行数据传递。
下面直接上代码:
//发布者接口
import 'package:ftplayer/common/utils/LogUtils.dart';
abstract class IPublisher {
void post<T>(T event);
}
//订阅者:函数对象
typedef ISubscriber<T> = void Function(T event);
//集中式通信,
//1.IEventBus继承IPublisher,分发数据
//2.IEventBus注册和取消注册ISubscriber
abstract class IEventBus extends IPublisher {
void register<T>(ISubscriber<T> subscriber);
void unregister<T>(ISubscriber<T> subscriber);
}
Type typeOf<T>() => T;
class XEventBus implements IEventBus {
//我们用map存放我们的订阅者。不同订阅者订阅的Event类型可能是不同的
Map<Type, List<Function>> map = {};
@override
void register<T>(ISubscriber<T> subscriber) {
Type type = typeOf<T>();
if (!map.containsKey(type)) {
map[type] = [];
}
map[type]?.add(subscriber);
}
@override
void unregister<T>(ISubscriber<T> subscriber) {
Type type = typeOf<T>();
if (map.containsKey(type)) {
map[type]?.remove(subscriber);
}
}
//发布
@override
void post<T>(T event) {
Type type = typeOf<T>();
if (map.containsKey(type)) {
var subscribers = map[type];
subscribers?.forEach((subscriber) => subscriber.call(event));
}
}
}
//外部调用方法
class EventBusProvider {
static final EventBusProvider _instance = EventBusProvider._internal();
XEventBus _singleEventBus = XEventBus();
factory EventBusProvider() {
return _instance;
}
EventBusProvider._internal();
XEventBus singleEventBus() {
return _singleEventBus;
}
XEventBus newEventBus() {
return XEventBus();
}
}
调用
late ISubscriber<LoginStatusEvent> loginSub;
loginSub = (event) {
loginStatus(event);
};
_eventBus.register(loginSub);
_eventBus.unregister(loginSub);
getEventBus().post(LoginStatusEvent(fromPageType: 0));
上述代码中,getEventBus()就是获取的EventBus对象,这里可以是单例,或者是new多个对象。主要看项目的情况决定。
that's all----------------------------------------------------------------