Flutter业务隔离-ModuleCenter

介绍

随着项目不断变大,需要对项目的模块进行解耦,这是我们需要一个事件分发中心,其他模块依赖注入到分发中心,获取一些需要的生命周期等的消息事件。

架构图

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 _listeners = ObserverList();

  void registerObserver(ModuleLifeListener listener) {
    _listeners.add(listener);
  }

  void unRegisterObserver(ModuleLifeListener listener) {
    _listeners.remove(listener);
  }

  @override
  void appInit() {
    final List localListeners =
    List.from(_listeners);
    localListeners.forEach((element) {element.appInit();});
  }

  @override
  void hostInit() {
    final List localListeners =
    List.from(_listeners);
    localListeners.forEach((element) {element.hostInit();});
  }

  @override
  void loginSuccess() {
    final List localListeners =
    List.from(_listeners);
    localListeners.forEach((element) {element.loginSuccess();});
  }

  @override
  void loginOut() {
    final List localListeners =
    List.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();
  }

}

你可能感兴趣的:(Flutter业务隔离-ModuleCenter)