基于MVVM封装Flutter Baselib

6,330 阅读3分钟

一、背景

随着Flutter技术日趋完善,越来越受开发者欢迎,使用Flutter开发的项目也越来越多,与原生开发一样,在开发之前要选择合适的架构,MVC、MVP或MVVM,然后搭建项目框架、封装常用的基类和组件、http、日志、异常上报、工具类......这些是每个项目都需要用的功能,属于项目的脚手架;

基于以上原因,封装了Flutter MVVM基础库(Flutter Baselib),封装是为了减少重复代码,提高代码复用性,提高开发效率,封装思路来源实际项目,基础库是对项目中常用基类和组件的抽取优化,并封装为独立的插件库;

二、Flutter Baselib简介

1、仓库地址

gitee.com/rishli/flut…

2、包含模块 

1、xlog日志库(仅Android会保存为日志文件,其它平台使用Flutter print()方法打印log到控制台); 

2、bugly异常上报、应用更新(仅Android平台会上报到bugly); 

3、基于dio封装网络请求组件XApi; 

4、封装http通用加载中、加载错误页,空白页以及正常显示页UI和逻辑,UI可自定义; 

5、封装http通用加载dialog控件和dialog显示隐藏逻辑,dialog UI可自定义; 

6、基于provider封装BaseViewModel基类和BaseView(MVVM); 

7、常用工具类ToastUtils、LogUtils、PermissionUtils、DeviceUtils......;

三、使用指南

1、git接入

dependencies:
    flutter_baselib:
        git:
            url: https://gitee.com/rishli/flutter_baselib_plugin.git
            ref: (修改为最新的tag)

2、初始化

a、应用启动时,调用BaseLibPlugin.init()初始化各个模块:

///应用启动时初始化,参考下面代码
BaseLibPlugin.init(
        isDebug: true,
        ///日志库配置
        logConfig: LogConfig.obtain(
            tag: "lixu",
            isConsolePrintLog: true,
            isFlutterPrintLog: false,
            saveLogFilePath: '/storage/emulated/0/flutter_xlog_app/xlog/',
            isLogFileEncrypt: false,
        ),
        ///http配置
        httpConfig: HttpConfigImpl(),
        ///全局通用资源配置
        resConfig: ResConfigImpl(),
        ///bugly相关配置
        buglyConfig: BuglyConfig.defaultAndroid('8b841196c7'),
        ///toast相关配置
        toastConfig: ToastConfig.obtain(
            fontSize: 14,
            gravity: ToastGravity.BOTTOM,
            backgroundColor: Colors.black87,
            textColor: Colors.white,
        ),
);

b、初始化resConfig配置:参考下面代码,根据业务实现IResConfig 接口:

///@date:  2021/3/1 14:06
///@author:  lixu
///@description:  全局资源配置
class ResConfigImpl implements IResConfig {

///自定义http全局空白页
@override
Widget configLoadEmptyView() {
    return LoadEmptyView();
}

///自定义http全局加载错误页
@override
Widget configLoadErrorView() {
    return LoadErrorView();
}

///自定义http全局加载中的页面
@override
Widget configLoadingView() {
    return LoadingView();
}

}

3、全局context使用

a、初始化全局context,参考下面代码:

return MaterialApp(
    home: HomePage(),
    builder: BaseLibPlugin.oneContextBuilder,
    navigatorKey: BaseLibPlugin.oneContextKey,
);

b、在无法获取context对象的地方通过:BaseLibPlugin.context可以获取到context,可以用于显示dialog或路由跳转;

4、bugly使用

a、在应用main()方法中调用异常捕获方法:

void main() {
      BaseLibPlugin.postCatchException(
        () => runApp(App()),
        onUploadCallback: (String errMsg, errDetail) {
            ///上传日志到bugly时,回调该方法
            LogUtils.e('bugly捕获异常msg', errMsg);
            LogUtils.e('bugly捕获异常detail', errDetail);

            ///根据业务处理逻辑
            
        },
      );
}

b、在应用启动时调用BaseLibPlugin.init()初始化buglyConfig:

///应用启动时初始化bugly
BaseLibPlugin.init(
        ... 省略其它代码
        ///bugly相关配置
        buglyConfig: BuglyConfig.defaultAndroid('8b841196c7'),
        ...
);

c、手动上报异常FlutterBugly.uploadException():

///上报自定义异常信息,data为文本附件
///Android 错误分析=>跟踪数据=>extraMessage.txt
///iOS 错误分析=>跟踪数据=>crash_attach.log
static Future<Null> uploadException({
    @required String message,
    @required String detail,
    Map data,
}) 

d、检测更新FlutterBugly.checkUpgrade();

5、Log工具使用

a、在应用启动时调用BaseLibPlugin.init()初始化logConfig:

///应用启动时初始化,参考下面代码
BaseLibPlugin.init(
        ...省略其它代码
        ///日志库配置
        logConfig: LogConfig.obtain(
            tag: "lixu",
            isConsolePrintLog: true,
            isFlutterPrintLog: false,
            saveLogFilePath: '/storage/emulated/0/flutter_xlog_app/xlog/',
            isLogFileEncrypt: false,
        ),
        ...
);

b、使用LogUtils类打印日志,android平台下会保存日志文件到saveLogFilePath路径下;

6、http组件使用

查看我的另一篇文章Flutter Dio封装实践

7、MVVM实践

查看我的另一篇文章Flutter MVVM实践

四、总结

1、这些功能都比较简单,但却很常见,又是很容易忽略的一些细节,通过封装能让这些功能复用,不用关注这些细节,专注业务开发; 

2、基础库包含的功能模块只是根据自身业务封装,不可能满足所有的场景,但是可以根据具体业务场景进行扩展,也可以借鉴这些封装思路,实现适合自身业务的基础库; 

3、后面会完善基础库功能,扩展通用性;