Flutter社区的一个library: get_it

视频介绍:Flutter Dependency Injection For Beginners | Complete Guide
视频对应的博文 :Dependency Injection in Flutter

官网的介绍:

Simple direct Service Locator that allows to decouple the interface from a concrete implementation and to access the concrete implementation from everywhere in your App

关于什么是Service Locator:

If you are not familiar with the concept of Service Locators, its a way to decouple the interface (abstract base class) from a concrete implementation and at the same time allows to access the concrete implementation from everywhere in your App over the interface. I can only highly recommend to read this classic article by from Martin Fowler Inversion of Control Containers and the Dependency Injection pattern

所以Service Locator可以将接口(抽象基类)与具体实现分离,同时允许通过接口从App中的任何位置访问具体实现。

对于依赖注入不是很了解的同学可以参考:

  • IoC容器和Dependency Injection模式

  • One to find them all: How to use Service Locators with Flutter


为什么要使用get_it

我们也可以通过其他的方式在app中的任意位置获取到要访问的对象,但是:

  • 如果使用Singleton,则无法轻松地将实现切换到另一个(例如用于单元测试的模拟版本)
  • 用于依赖项注入的IoC容器提供了类似的功能,但代价是启动时间慢且可读性差,因为您不知道神奇注入的对象来自何处。 由于大多数IoC库都依赖反射,因此它们不能与Flutter一起使用。

使用场景

  • 访问诸如REST API客户端,数据库之类的服务对象,以便可以轻松模拟它们
  • 从Flutter视图访问View / AppModels / Manager
  • 由于接口和实现是分离的,因此您还可以在不同的实现中注册Flutter Views,并在启动时确定要使用的视图,例如 取决于屏幕分辨率

使用注意事项

按照官方解释:始终使用相同的样式将项目文件作为相对路径或我建议的包导入。 不要混用它们,因为虽然两种导入方式都引用相同的文件,但目前Dart将以不同方式导入的类型视为两种不同的类型。

比如我们在lib根目录下新建了一个Service Locator,我们要在不同的文件中使用,可以使用以下两种方式导入,官方的意思是应该一直使用同一种方式导入。

那么如果真的混合使用,会有什么影响吗?我试过在不同的文件中使用不同的导入方式混用,但没发现异常,且locator对象本来就是一个单例的,
知道的人可以告诉一下我,?

import '../../locator.dart';
import 'package:provider_architecture/locator.dart';

如何使用

  1. 获取GetIt对象
GetIt getIt = GetIt.instance;//There is also a shortcut (if you don't like it just ignore it):
GetIt getIt = GetIt.I;
  1. 注册
sl.registerSingleton<AppModel>(AppModelImplementation());
sl.registerLazySingleton<RESTAPI>(() =>RestAPIImplementation());// if you want to work just with the singleton:
GetIt.instance.registerSingleton<AppModel>(AppModelImplementation());
GetIt.I.registerLazySingleton<RESTAPI>(() =>RestAPIImplementation());
  1. 获取服务对象
var myAppModel = sl.get<AppModel>();
var myAppModel = sl<AppModel>();// as Singleton:
var myAppModel = GetIt.instance<AppModel>();
var myAppModel = GetIt.I<AppModel>();
  1. 注册的种类
  • Factory工厂模式
void registerFactory<T>(FactoryFunc<T> func)locator.registerLazySingleton(() => Api());locator.registerFactory(() => HomeModel());

传入参数是一个函数func,这个func函数要返回一个实现了类型T的对象,每次调用获取对象的方式时,都会返回一个新对象

  • 单例模式&懒加载单例

单例注册时,传入一个范型T的对象或其子类的对象,如果创建这个单例时是耗时的,那么可以不在app启动的时候注册,而放到第一次使用到该服务的时候,即使用懒加载的方式。

void registerSingleton<T>(T instance) void registerLazySingleton<T>(FactoryFunc<T> func)

一个例子:

在app启动的时候调用注册方法

void main() {setupLocator();runApp(MyApp());
}注册方法内部细节

单独的locator.dart文件:

GetIt locator = GetIt.instance;void setupLocator() {locator.registerLazySingleton(() => Api());
}

在数据类中使用服务

Api _api = locator<Api>();List<Comment> comments;Future fetchComments(int postId) async {...comments = await _api.getCommentsForPost(postId);...}

Flutter中的依赖注入——get_it相关推荐

  1. 转: 理解AngularJS中的依赖注入

    理解AngularJS中的依赖注入 AngularJS中的依赖注入非常的有用,它同时也是我们能够轻松对组件进行测试的关键所在.在本文中我们将会解释AngularJS依赖注入系统是如何运行的. Prov ...

  2. JavaEE开发之Spring中的依赖注入与AOP编程

    上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...

  3. 理解AngularJS中的依赖注入

    作者 CraftsCoder 冷月无声 - 博客频道 - CSDN.NET http://blog.csdn.net/jaytalent/article/details/50986402 本文结合一些 ...

  4. spring中的依赖注入——构造函数注入、set方法注入( 更常用的方式)、复杂类型的注入/集合类型的注入

    spring中的依赖注入 依赖注入: Dependency Injection IOC的作用:降低程序间的耦合(依赖关系) 依赖关系的管理:以后都交给spring来维护.在当前类需要用到其他类的对象, ...

  5. Angular 中的依赖注入link

    Angular 中的依赖注入link 依赖注入(DI)是一种重要的应用设计模式. Angular 有自己的 DI 框架,在设计应用时常会用到它,以提升它们的开发效率和模块化程度. 依赖,是当类需要执行 ...

  6. ASP.NET CORE MVC 2.0 如何在Filter中使用依赖注入来读取AppSettings

    问: ASP.NET CORE MVC 如何在Filter中使用依赖注入来读取AppSettings 答: Dependency injection is possible in filters as ...

  7. SAP Spartacus 中的依赖注入 Dependency Injection 介绍

    先了解 Angular 中的依赖注入 依赖项是指某个类执行其功能所需的服务或对象.依赖项注入(DI)是一种设计模式,在这种设计模式中,类会从外部源请求依赖项而不是让类自己来创建它们. Angular ...

  8. ASP.NET Core中的依赖注入(4): 构造函数的选择与服务生命周期管理

    ServiceProvider最终提供的服务实例都是根据对应的ServiceDescriptor创建的,对于一个具体的ServiceDescriptor对象来说,如果它的ImplementationI ...

  9. ASP.NET Core - 在ActionFilter中使用依赖注入

    上次ActionFilter引发的一个EF异常,本质上是对Core版本的ActionFilter的知识掌握不够牢固造成的,所以花了点时间仔细阅读了微软的官方文档.发现除了IActionFilter.I ...

最新文章

  1. 各种主流数据库的比较
  2. android助手专业版,开发助手专业版 v5.6.1-cs for Android 直装付费专业版
  3. IDEA查看某个类的某个方法或该类在哪里被调用 / 引用
  4. joomla添加html,html – 向joomla的前端组件视图添加表单
  5. Spring Cloud面试题(2020最新版)
  6. python---Socket编程
  7. ajax点击事件无法触发,解决jQuery Ajax动态新增节点无法触发点击事件的问题_婳祎_前端开发者...
  8. Redis之内存分析
  9. 打印出所有的 水仙花数 ,所谓 水仙花数 是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 水仙花数 ,因为153=1的三次方+5的三次方+3的三次方。...
  10. 机器学习Normal Equation的推导(不要求矩阵求导)
  11. 网络安全之DOS攻击
  12. 超低功耗高性能2.4GHz GFSK 无线收发芯片Si24R1替代NRF24L01P
  13. Python初学之温度转换
  14. 《美国职业橄榄球大联盟》:NFL·橄榄1号位
  15. 2021-2027全球与中国双联式过滤器外壳市场现状及未来发展趋势
  16. 怎样用VR看分频视频?
  17. YOLOv5如何训练自己的数据集
  18. Web全栈工程师年薪40w+,凭什么?
  19. [redis]知识回顾之redis主从+哨兵搭建简要记录
  20. 虎牙Java后台实现三次面经

热门文章

  1. 字体单位 html,CSS字体单位
  2. Chrome 插件下载、安装、加载正在开发的扩展程序和打包扩展程序
  3. 联想拯救者y9000k和y9000p的区别
  4. 联想拯救者y9000x和R9000X有什么区别 选哪个
  5. Bokeh可视化笔记——x轴设为日期
  6. Domain Adaption
  7. 国际信息研究学会专家杜彪:汉字识别是如何走上机器学习领域巅峰的?
  8. python电脑版怎么下载-Python
  9. 初窥MySQL的索引与事务
  10. idea中ctrl+shift+f(在文件中查找)失效,全图文解决方案