美文网首页
Flutter业务隔离-ModuleCenter

Flutter业务隔离-ModuleCenter

作者: jackyshan | 来源:发表于2020-10-17 23:11 被阅读0次

    介绍

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

    架构图

    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();
      }
    
    }
    

    相关文章

      网友评论

          本文标题:Flutter业务隔离-ModuleCenter

          本文链接:https://www.haomeiwen.com/subject/edugektx.html