阅读 934

为Flutter而生的轻量级依赖检索容器—Dartin

什么是Flutter?

Flutter 是 Google推出并开源的移动应用开发框架,主打跨平台、高保真、高性能。开发者可以通过 Dart语言开发 App,一套代码同时运行在 iOS 和 Android平台。

Flutter官网: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地址:github.com/ditclear/da…

dartin已经上传到pub,方便Flutter开发者集成。

dependencies:
  dartin: ^0.1.0
复制代码

一些关键的方法:

  • single:创建一个提供全局唯一的实例的provider。
  • lazy:创建一个provider,当第一次使用到它的时候才会创建实例。
  • factory:创建一个provider,每次都会提供新的实例。
  • inject:注入对象

更多信息可以查看dartin.dart

快速开始

  1. 创建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());
}
复制代码
  1. 进行依赖检索注入实例
//注入一个简单的实例
final service = inject<GithubService>();
//动态提供参数
final test = inject<HomeProvide>(params: ['title']);
//根据scope提供不同的实例
final test = inject<HomeProvide>(scope:test, params: ['title']);
复制代码

更多的例子可以查看 github.com/ditclear/mv…

原理很简单,总的来说就是一个依赖容器Map,key为配置的依赖类型,值为封装的一层Provider

factory(({params}) => HomeProvide(params.get(0), get()))

Key 就是 HomeProvider , 值是factory返回的一个Provider

当需要获取实例的时候,通过需要实例的runtimeType,通过Provider.get()方法根据是single/lazy/factory去提供相应的实例,所以记住写好T很重要

写在最后

DartIn是站在巨人肩膀上的产物,功能有了,但和Koin这种框架比较起来还有许多需更进一步,包括完善的单元测试、类型安全、更合理的提示,依赖构建的路径提供,今后我也将持续完善它,也希望能抛砖引玉,早日出现更好的依赖注入框架。

最后🍺 welcome to star、 fork and pull request.

========================== 分割线 ==========================

如果你想了解更多关于MVVM、Flutter、响应式编程方面的知识,欢迎关注我。

你可以在以下地方找到我:

简书:www.jianshu.com/u/117f1cf0c…

掘金:juejin.im/user/582d60…

Github: github.com/ditclear

关注下面的标签,发现更多相似文章
评论