Flutter学习(六)EventBus的使用

背景

项目开发过程中,有些场景,需要跨页面进行数据传递。按照安卓开发的思路,在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----------------------------------------------------------------

相关推荐
WDeLiang1 小时前
Flutter - UIKit开发相关指南 - 线程和异步
flutter·ios·dart
兔子坨坨1 小时前
pycharm连接github(详细步骤)
windows·git·学习·pycharm·github
虾球xz2 小时前
游戏引擎学习第293天:移动Familiars
c++·学习·游戏引擎
lichuangcsdn2 小时前
【springcloud学习(dalston.sr1)】Eureka服务端集群的搭建(含源代码)(二)
学习·spring cloud·eureka
名誉寒冰2 小时前
RPC框架源码分析学习(二)
qt·学习·rpc
m0_738206545 小时前
嵌入式学习的第二十二天-数据结构-栈+队列
数据结构·学习
向上的车轮11 小时前
MATLAB学习笔记(七):MATLAB建模城市的雨季防洪排污的问题
笔记·学习·matlab
前端小崔12 小时前
从零开始学习three.js(18):一文详解three.js中的着色器Shader
前端·javascript·学习·3d·webgl·数据可视化·着色器
龙湾开发12 小时前
计算机图形学编程(使用OpenGL和C++)(第2版)学习笔记 10.增强表面细节(二)法线贴图
c++·笔记·学习·图形渲染·贴图
liang_202613 小时前
【HT周赛】T3.二维平面 题解(分块:矩形chkmax,求矩形和)
数据结构·笔记·学习·算法·平面·总结