Flutter中的依赖注入——get_it
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';
如何使用
- 获取GetIt对象
GetIt getIt = GetIt.instance;//There is also a shortcut (if you don't like it just ignore it):
GetIt getIt = GetIt.I;
- 注册
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());
- 获取服务对象
var myAppModel = sl.get<AppModel>();
var myAppModel = sl<AppModel>();// as Singleton:
var myAppModel = GetIt.instance<AppModel>();
var myAppModel = GetIt.I<AppModel>();
- 注册的种类
- 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相关推荐
- 转: 理解AngularJS中的依赖注入
理解AngularJS中的依赖注入 AngularJS中的依赖注入非常的有用,它同时也是我们能够轻松对组件进行测试的关键所在.在本文中我们将会解释AngularJS依赖注入系统是如何运行的. Prov ...
- JavaEE开发之Spring中的依赖注入与AOP编程
上篇博客我们系统的聊了<JavaEE开发之基于Eclipse的环境搭建以及Maven Web App的创建>,并在之前的博客中我们聊了依赖注入的相关东西,并且使用Objective-C的R ...
- 理解AngularJS中的依赖注入
作者 CraftsCoder 冷月无声 - 博客频道 - CSDN.NET http://blog.csdn.net/jaytalent/article/details/50986402 本文结合一些 ...
- spring中的依赖注入——构造函数注入、set方法注入( 更常用的方式)、复杂类型的注入/集合类型的注入
spring中的依赖注入 依赖注入: Dependency Injection IOC的作用:降低程序间的耦合(依赖关系) 依赖关系的管理:以后都交给spring来维护.在当前类需要用到其他类的对象, ...
- Angular 中的依赖注入link
Angular 中的依赖注入link 依赖注入(DI)是一种重要的应用设计模式. Angular 有自己的 DI 框架,在设计应用时常会用到它,以提升它们的开发效率和模块化程度. 依赖,是当类需要执行 ...
- ASP.NET CORE MVC 2.0 如何在Filter中使用依赖注入来读取AppSettings
问: ASP.NET CORE MVC 如何在Filter中使用依赖注入来读取AppSettings 答: Dependency injection is possible in filters as ...
- SAP Spartacus 中的依赖注入 Dependency Injection 介绍
先了解 Angular 中的依赖注入 依赖项是指某个类执行其功能所需的服务或对象.依赖项注入(DI)是一种设计模式,在这种设计模式中,类会从外部源请求依赖项而不是让类自己来创建它们. Angular ...
- ASP.NET Core中的依赖注入(4): 构造函数的选择与服务生命周期管理
ServiceProvider最终提供的服务实例都是根据对应的ServiceDescriptor创建的,对于一个具体的ServiceDescriptor对象来说,如果它的ImplementationI ...
- ASP.NET Core - 在ActionFilter中使用依赖注入
上次ActionFilter引发的一个EF异常,本质上是对Core版本的ActionFilter的知识掌握不够牢固造成的,所以花了点时间仔细阅读了微软的官方文档.发现除了IActionFilter.I ...
最新文章
- 各种主流数据库的比较
- android助手专业版,开发助手专业版 v5.6.1-cs for Android 直装付费专业版
- IDEA查看某个类的某个方法或该类在哪里被调用 / 引用
- joomla添加html,html – 向joomla的前端组件视图添加表单
- Spring Cloud面试题(2020最新版)
- python---Socket编程
- ajax点击事件无法触发,解决jQuery Ajax动态新增节点无法触发点击事件的问题_婳祎_前端开发者...
- Redis之内存分析
- 打印出所有的 水仙花数 ,所谓 水仙花数 是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 水仙花数 ,因为153=1的三次方+5的三次方+3的三次方。...
- 机器学习Normal Equation的推导(不要求矩阵求导)
- 网络安全之DOS攻击
- 超低功耗高性能2.4GHz GFSK 无线收发芯片Si24R1替代NRF24L01P
- Python初学之温度转换
- 《美国职业橄榄球大联盟》:NFL·橄榄1号位
- 2021-2027全球与中国双联式过滤器外壳市场现状及未来发展趋势
- 怎样用VR看分频视频?
- YOLOv5如何训练自己的数据集
- Web全栈工程师年薪40w+,凭什么?
- [redis]知识回顾之redis主从+哨兵搭建简要记录
- 虎牙Java后台实现三次面经