为Flutter而生的轻量级依赖检索容器—Dartin
什么是Flutter?
Flutter 是 Google推出并开源的移动应用开发框架,主打跨平台、高保真、高性能。开发者可以通过 Dart语言开发 App,一套代码同时运行在 iOS 和 Android平台。
Flutter官网:https://flutter-io.cn
在学习Flutter一段时间之后,我们已经在实际项目中进行了实践,效果还是蛮不错的:无差的UI、同样的业务逻辑、减少沟通交流的成本、HotReload等等都是令人愿意继续深耕的理由
但与Android/IOS等发展多年、稳定高效的开发模式相比,无疑还处在新生阶段。在编写Dart代码的这段时间中,我尝试将以前的开发经验迁移到Flutter项目中,其中自然也包括依赖注入的思想,但发现社区还没有提供这样的第三方依赖,但实际是有这方面需求的,在google关于flutter第二期的问答中,也提到了相关的问题。
issue因为以前有写过分析Koin依赖检索原理的文章(当Koin撞上ViewModel),有这方面知识的积累。加上近期在运用flutter-provide进行状态管理的过程中发现provide稍加改进便可以化身为一个依赖注入框架,于是我便动手进行了这方面的改造。
DartIn
灵感来自于Koin(一个为Kotlin开发者提供的轻量级依赖检索容器)。
用法也跟Koin类似,代码总共就261行(包括注释),易于使用也方便理解。
github地址:https://github.com/ditclear/dartin
dartin已经上传到pub,方便Flutter开发者集成。
dependencies:
dartin: ^0.1.0
一些关键的方法:
- single:创建一个提供全局唯一的实例的provider。
- lazy:创建一个provider,当第一次使用到它的时候才会创建实例。
- factory:创建一个provider,每次都会提供新的实例。
- inject<T>:注入对象
更多信息可以查看dartin.dart。
快速开始
- 创建Module,配置依赖
//scope 必须是全局的,并且是静态不可变的
const test = DartInScope('test');
//在Module构造方法中定义的依赖配置会放到默认的作用域_defaule中
final viewModelModule = Module([
factory<HomeProvide>(({params}) => HomeProvide(params.get(0), get<GithubRepo>())),
])
..addOthers(test , [
///other scope
factory<HomeProvide>(({params}) => HomeProvide(params.get(0), get<GithubRepo>())),
]);
final repoModule = Module([
lazy<GithubRepo>(({params}) => GithubRepo(get<GithubService>())),
]);
final remoteModule = Module([
single<GithubService>(GithubService()),
]);
final appModule = [viewModelModule, repoModule, remoteModule];
2 . 加载配置项到dartins
void main() {
startDartIn(appModule);
runApp(MyApp());
}
- 进行依赖检索注入实例
//注入一个简单的实例
final service = inject<GithubService>();
//动态提供参数
final test = inject<HomeProvide>(params: ['title']);
//根据scope提供不同的实例
final test = inject<HomeProvide>(scope:test, params: ['title']);
更多的例子可以查看 https://github.com/ditclear/mvvm_flutter
原理很简单,总的来说就是一个依赖容器Map,key为配置的依赖类型,值为封装的一层Provider。
factory<HomeProvide>(({params}) => HomeProvide(params.get(0), get<GithubRepo>()))
Key 就是 HomeProvider , 值是factory返回的一个Provider
当需要获取实例的时候,通过需要实例的runtimeType,通过Provider.get()方法根据是single/lazy/factory去提供相应的实例,所以记住写好<T>很重要。
写在最后
DartIn是站在巨人肩膀上的产物,功能有了,但和Koin这种框架比较起来还有许多需更进一步,包括完善的单元测试、类型安全、更合理的提示,依赖构建的路径提供,今后我也将持续完善它,也希望能抛砖引玉,早日出现更好的依赖注入框架。
最后🍺 welcome to star、 fork and pull request.
==================== 分割线 ======================
如果你想了解更多关于MVVM、Flutter、响应式编程方面的知识,欢迎关注我。
你可以在以下地方找到我:
简书:https://www.jianshu.com/u/117f1cf0c556
掘金:https://juejin.im/user/582d601d2e958a0069bbe687
Github: https://github.com/ditclear