介绍
随着项目不断变大,需要对项目的模块进行解耦,这是我们需要一个事件分发中心,其他模块依赖注入到分发中心,获取一些需要的生命周期等的消息事件。
架构图
ModuleCenter
注入业务module, 取消注入业务module,发送消息事件给业务module。ModuleLifeListener
定义消息事件,被业务module继承。
import 'package:flutter/foundation.dart';
import 'package:lovemeet/common/module_center/module_life_listener.dart';
class ModuleCenter implements ModuleLifeListener {
static ModuleCenter _instance;
static ModuleCenter ins() {
if (_instance == null) {
_instance = ModuleCenter._();
}
return _instance;
}
ModuleCenter._();
final ObserverList<ModuleLifeListener> _listeners = ObserverList();
void registerObserver(ModuleLifeListener listener) {
_listeners.add(listener);
}
void unRegisterObserver(ModuleLifeListener listener) {
_listeners.remove(listener);
}
@override
void appInit() {
final List<ModuleLifeListener> localListeners =
List<ModuleLifeListener>.from(_listeners);
localListeners.forEach((element) {element.appInit();});
}
@override
void hostInit() {
final List<ModuleLifeListener> localListeners =
List<ModuleLifeListener>.from(_listeners);
localListeners.forEach((element) {element.hostInit();});
}
@override
void loginSuccess() {
final List<ModuleLifeListener> localListeners =
List<ModuleLifeListener>.from(_listeners);
localListeners.forEach((element) {element.loginSuccess();});
}
@override
void loginOut() {
final List<ModuleLifeListener> localListeners =
List<ModuleLifeListener>.from(_listeners);
localListeners.forEach((element) {element.loginOut();});
}
}
MainModule
初始化,注册其他业务module到center。
class MainModule implements ModuleLifeListener {
MainModule() {
//初始化main之外的modules
ModuleCenter.ins().registerObserver(MessageModule());
}
@override
void appInit() {
//初始化Native
NativeInit.initEnv(UserManager.instance.env==Env.EnvOnLine?1:0);
NativeInit.initLog();
}
@override
void hostInit() {
NativeInit.initHost(UserManager.instance.hostInfo.toJson());
}
@override
void loginSuccess() {
//获取config配置
AppConfig.instance.reqConfig();
}
@override
void loginOut() {
//跳转登录页
UserManager.instance.navigatorKey.currentState.pushAndRemoveUntil(
PageRouteBuilder(
transitionDuration: Duration(milliseconds: 200),
pageBuilder: (BuildContext context, Animation animation,
Animation secondaryAnimation) {
return new FadeTransition(
//使用渐隐渐入过渡,
opacity: animation,
child: UserLoginPage(),
);
},
),
(route) => false
);
}
}
MessageModule
收到ModuleCenter发出的事件,开始初始化相关操作。
- appInit
- hostInit
- loginSuccess
- loginOut
class MessageModule implements ModuleLifeListener {
@override
void appInit() {
//初始化video sdk
MediaLink.init();
}
@override
void hostInit() {
//初始化长连接
SocketLink.init(UserManager.instance.socketHost()+'/time/getconfig');
}
@override
void loginSuccess() {
//初始化数据库
MessageDB.instance.initDB();
//更新Native用户信息
NativeInit.initUser(UserManager.instance.userInfo.toJson());
//启动长连接
SocketLink.start();
//上传apns推送token
//...
//设置video uid
MediaLink.setUid(UserManager.instance.userInfo.uid);
}
@override
void loginOut() {
//关闭长连接
SocketLink.stop();
//关闭数据库
MessageDB.instance.closeDB();
}
}