随便在网上搜一下Dragger2,一大堆文章铺天盖地,但是很多都不清楚。下面这篇文章主要介绍了关于入门使用Dagger2的基础教程的相关资料,通过示例代码介绍的非常详细,有需要的朋友可以参考一下。
前言
前段时间,Dagger2用在了公司的项目中。之前听说过Dagger2,但没用过,主要是入门难度比Rxjava和改型高很多。我个人认为这个难度不是指使用的难度,而是一个理解的难度。很多人只是复制代码,写一个组件,一个模块就会说可以用Dagger2。大概你也不知道为什么要写这些。然后这篇文章将告诉你为什么我们使用Dagger2,因为它增加了代码量。
什么是Dagger2
Dagger2是Dagger的升级版,是目前Android最好的依赖注入框架。它在编译期间自动生成代码,并负责创建依赖对象。第一代是Square共享的,第二代是Google接手后推出的。
为什么我要使用Dagger2
例如,使用Dagger2的主要目的是减少类之间的耦合。
这里有一个人类。我们在这个类中,希望使用RichPerson类中的方法。然后我们需要在Person类中获得RichPerson的一个实例。也就是说,Person和RichPerson耦合在一起,违反了单一的义务。如果仍然有许多类需要使用RichPerson类中的方法,将会有许多类与RichPerson类耦合。一旦改变了RichPerson的构造方法,比如需要传入一个id才能使用,那么所有使用RichPerson的类都需要改变,这是一个不小的工作量,也违背了开放封闭原则。
这时,如果我们使用Dagger2,就可以在Person类中通过@Inject得到RichPerson实例,而不用亲自去new RichPerson。
使用(基于Kotlin)
在项目的build.gradle中,添加
应用插件:“kotlin-kapt”
依赖关系{
kapt com . Google . dagger:dagger-compiler:2 . 14 . 1
实现 com . Google . dagger:dagger:2 . 14 . 1
}
我们以MVP模式为例。
1.传统MVP
在视图层,如果我们想获得数据,那么我们必须通过构造获得P层对象。
这里就不演示gif了。只是敬酒提示。这个传统的MVP会在视图层实例化Persenter。
2.Dagger2方式MVP
那么如何才能以Dagger2的方式得到V层中P层的引用呢?
1.我们需要在P层的构造方法中添加一个@Inject注释,告诉Dagger2我可以通过注释得到它。
2.为任何需要使用@Inject注释来获取对象的类创建一个组件类。这一步其实相当于告诉Dagger2我的类需要使用@Inject来获取对象。
3.构建——Make项目时,Dagger2会自动生成Dagger * * *组件,例如
4.通过@Inject和V层的Component获取实例对象
至此,Dagger2基本用完,我们可以通过@Inject得到任何想要的对象(@Inject需要在这个对象的构造方法之前添加),不需要new。
V层拿P层,P层拿V层
通过上面的方式,我们可以在V层获取P层的引用,调用P层的方法,那么如果需要在P层获取V层的对象,该怎么办呢?也为P层定义一个组件?不,在这里,我们需要使用一个新的知识点,模块。
那么,什么是模块呢?我个人的理解是把自己提供给其他班使用。
1.在p层的构造中添加@Inject注释,添加v层的参数。
2.为V层定义一个对应的模块,自己提供。
3.创建对应于V层的组件。与上面不同,我们需要在这里定义一个模块。
4.构建——Make项目,该项目自动生成Dagger * * *组件
5.打电话
可能你还在这里迷茫。怎么能调用这些方法,把自己传下去呢?别慌,我们带你去看Dagger2生成的代码。
DagmainActivityComponent。生成器()返回了一个生成器。
Builder是一个空结构,我们继续往下看。MainActivityModule(MainActivityModule(this))把自己传进去,这里
做出非空判断后,给成员变量赋值,然后返回构建器本身。build()如果上面传入的值为null,抛出异常,否则调用Comopent construction并将其传入builder。
将生成器中的模块分配给组件中的模块。注入(this)是传递给自身的(this在这里是活动本身)
调用injectMainpresenter方法,后面的getMainpresenter会得到Presenter对象,然后给activity中@Inject注释的Presenter赋值。
活动被传递给新的演示者以完成分配。
至此,我们的对象实例化完成。
总结
本文只是用MVP的例子来解释Dagger2的用法。当然,您可以在任何想要实例化对象的地方使用Dagger2。说白了,你只需要记住,你想要什么对象,你只需要在那个对象的结构前面加上@Inject注释就可以了。如果你实例化的对象也需要你,那么你可以为自己创建一个模块并提供它。
最后,附上这个演示的github地址,https://github.com/lxt1994/Dagger2Demo(本地下载)。
以上纯属个人工作学习总结。如有错误,请随时指出。我们可以一起讨论,一起进步。
好了,这就是本文的全部内容。希望这篇文章的内容对你的学习或工作有一定的参考价值。有问题可以留言交流。谢谢你的支持。