一、背景
随着Flutter技术日趋完善,越来越受开发者欢迎,使用Flutter开发的项目也越来越多,与原生开发一样,在开发之前要选择合适的架构,MVC、MVP或MVVM,然后搭建项目框架、封装常用的基类和组件、http、日志、异常上报、工具类......这些是每个项目都需要用的功能,属于项目的脚手架;
基于以上原因,封装了Flutter MVVM基础库(Flutter Baselib),封装是为了减少重复代码,提高代码复用性,提高开发效率,封装思路来源实际项目,基础库是对项目中常用基类和组件的抽取优化,并封装为独立的插件库;
二、Flutter Baselib简介
1、仓库地址
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、后面会完善基础库功能,扩展通用性;