Flutter中的IoC

31 1月

因为长期做后端开发,Spring提供的IoC功能确实用的很多。到了Flutter中各种依赖项目的管理也很麻烦,也影响单元测试的编写。

所以在Flutter还是希望延续平时的习惯,使用IoC去控制依赖等关系。但是Flutter中有一些特殊的情况,比如Flutter禁用了dart:mirrors,反射的使用上有一些问题。对比了几个框架,最开始考虑的是Google下面的inject.dart,但是文档这块比较缺,还有就是注解+代码生成的方式强大,但是不是很喜欢,也用不了这么强的功能。由于名字的原因也看了下ioc库(https://pub.dev/packages/ioc),对于API的语法不是很喜欢。最后选择使用GetIt。

使用上比较简单,引用依赖

dependencies:
  get_it: ^3.1.0

代码中专门配置一个方法用于管理所有依赖配置

class IocConfiguration {
  configDependencies(
      {AnalysisService analysisService}) {
    var loader = GetIt.I;

    loader
        .registerLazySingleton<LoggingService>((() => SimpleLoggingService()));

    if (analysisService != null) {
      loader.registerLazySingleton<AnalysisService>((() => analysisService));
    } else {
      loader.registerLazySingleton<AnalysisService>(
          (() => FirebaseAnalysisService()));
    }

    loader.registerLazySingleton<HttpService>((() => DioHttpService(
        loader.get<AnalysisService>(), loader.get<LoggingService>())));

    return loader;
  }
}

由于这个方法启动时会调用,所以所有依赖都是配置的懒加载,而各种Service都是用构造器设置依赖。

同时留了个口子,对于单元测试需要替换的/需要Mock的对象可以在配置时额外传入。这一块以后怎么管理还没有想好,目前还够用。

总的来说因为反射的缺失,这块还是满不方便,类似的还有json序列化和反序列化。

参考

https://github.com/google/inject.dart#can-i-use-this-with-flutter

https://pub.dev/packages/get_it

发表评论

电子邮件地址不会被公开。