行业网站设计开发费用,东莞网站设计制作公司,射洪网站建设工作室,临清建设局网站背景
项目开发过程中#xff0c;有些场景#xff0c;需要跨页面进行数据传递。按照安卓开发的思路#xff0c;在flutter实现一个事件总线EventBus#xff0c;进行数据传递
原理
通过dart的签名函数#xff0c;进行监听集合设置#xff0c;然后post分发的时候#xff…背景
项目开发过程中有些场景需要跨页面进行数据传递。按照安卓开发的思路在flutter实现一个事件总线EventBus进行数据传递
原理
通过dart的签名函数进行监听集合设置然后post分发的时候进行集合遍历回调实现事件传递。
实现过程
总体思路就是通过一个订阅取消订阅遍历订阅对象进行数据传递。 下面直接上代码
//发布者接口
import package:ftplayer/common/utils/LogUtils.dart;abstract class IPublisher {void postT(T event);
}//订阅者:函数对象
typedef ISubscriberT void Function(T event);//集中式通信
//1.IEventBus继承IPublisher,分发数据
//2.IEventBus注册和取消注册ISubscriber
abstract class IEventBus extends IPublisher {void registerT(ISubscriberT subscriber);void unregisterT(ISubscriberT subscriber);
}Type typeOfT() T;class XEventBus implements IEventBus {//我们用map存放我们的订阅者。不同订阅者订阅的Event类型可能是不同的MapType, ListFunction map {};overridevoid registerT(ISubscriberT subscriber) {Type type typeOfT();if (!map.containsKey(type)) {map[type] [];}map[type]?.add(subscriber);}overridevoid unregisterT(ISubscriberT subscriber) {Type type typeOfT();if (map.containsKey(type)) {map[type]?.remove(subscriber);}}//发布overridevoid postT(T event) {Type type typeOfT();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 ISubscriberLoginStatusEvent loginSub;loginSub (event) {loginStatus(event);};_eventBus.register(loginSub);_eventBus.unregister(loginSub);getEventBus().post(LoginStatusEvent(fromPageType: 0));
上述代码中getEventBus()就是获取的EventBus对象这里可以是单例或者是new多个对象。主要看项目的情况决定。
that’s all----------------------------------------------------------------