dagger2 有必要用吗,dagger2原理

dagger2 有必要用吗,dagger2原理,Dagger2新手入门与使用基础教程

随便在网上搜一下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构造并将其传入构建器。

将生成器中的模块分配给组件中的模块。注入(this)是传递给自身的(this在这里是活动本身)

调用injectMainpresenter方法,后面的getMainpresenter会得到Presenter对象,然后给activity中@Inject注释的Presenter赋值。

活动被传递给新的演示者以完成分配。

至此,我们的对象实例化完成。

总结

本文只是用MVP的例子来解释Dagger2的用法。当然,您可以在任何想要实例化对象的地方使用Dagger2。说白了,你只需要记住,你想要什么对象,你只需要在那个对象的结构前面加上@Inject注释就可以了。如果你实例化的对象也需要你,那么你可以为自己创建一个模块并提供它。

最后,附上这个演示的github地址,https://github.com/lxt1994/Dagger2Demo(本地下载)。

以上纯属个人工作学习总结。如有错误,请随时指出。我们可以一起讨论,一起进步。

好了,这就是本文的全部内容。希望这篇文章的内容对你的学习或工作有一定的参考价值。有问题可以留言交流。谢谢你的支持。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: