登录 立即注册
安币:

楼主: Ek645

Dagger2新手入门与使用基础教程,dagger2

[复制链接]

501

主题

1018

帖子

2076

安币

手工艺人

发表于 2018-4-28 13:11:00 | 显示全部楼层 |阅读模式

            

        前言

        前段时间,公司项目使用到了dagger2,之前自己倒是听说过dagger2,但是一直没有去使用,主要是因为入门难度相对于rxjava,retrofit要高不少,个人觉得这个难度并不是指的使用难度,而是一个理解难度。很多人就是代码照搬,写一个component,一个module就说自己会用dagger2了,很可能你都不知道为什么你要去写这些。那么本篇文章将告诉你,dagger2既然增加了代码量,那么,我们为什么还要去使用它。

        什么是dagger2

        dagger2是dagger的升级版,是android目前最好用的依赖注入框架,在编译期间自动生成代码,负责依赖对象的创建。第一代由square公司共享出来,第二代则是由谷歌接手后推出的。

        为什么我要使用dagger2

        我们使用dagger2的主要目的是降低类与类之间的耦合度,举个例子。

        

        这里有一个person类,我们在这个类里面,想使用richperson类中的方法,那么我们就需要在person类中拿到richperson的实例,也就是说person和richperson耦合到一起了,违背了单一职责。如果还有很多类都要使用richperson类中的方法,那么就会有很多类跟richperson这个类耦合起来,一旦richperson构造方法变了,比如需要传入一个id才能使用,那么所有使用richperson的类都需要改,这个工作量可不小,而且这样也违背了开闭原则。
这个时候如果我们使用dagger2,我们就可以在person类中通过@inject的方式拿到richperson实例而不需要在person中去new richperson

        

        使用(基于kotlin)

        在项目的build.gradle中,添加

[Java] 查看源文件 复制代码
apply plugin: 'kotlin-kapt'
dependencies {
 kapt 'com.google.dagger:dagger-compiler:2.14.1' 
 implementation 'com.google.dagger:dagger:2.14.1'
}

        这里我们就以mvp模式为例

        1.传统mvp

        在view层我们想要去获取数据,那么我们就要去通过构造拿到p层对象

        

        这边gif我就不演示了,单纯的吐司提示而已,这种传统的mvp会在view层去实例化persenter

        2.dagger2方式mvp

        那么用dagger2的方式,我们应该怎么在v层拿到p层的引用呢?

        1.我们需要在p层的构造方法中添加一个@inject注解,告诉dagger2,我是可以通过注解拿到的

        


        2.给你任何需要用@inject注解拿对象的类创建一个component类,这一步其实就是相当于告诉dagger2,我这个类需要用到@inject拿对象哦

        


        3.build――>make project,dagger2会自动生成dagger+***component,比如

        


        4.在v层中通过@inject和component拿到实例对象

        


        到此,dagger2基本使用完毕,我们可以通过@inject拿到我们想要的任何对象(这个对象的构造方法前面需要添加@inject),并且不需要new

        v层拿p层,p层拿v层

        上面的方式,我们可以在v层拿到p层的引用并且去调用p层的方法,那么如果我们需要在p层中拿到v层的对象,该怎么办呢?给p层也定义一个component?不是的,这里,我们需要用到一个新的知识点,module

        那么,什么是module呢,我个人的理解,就是把我本身提供出去,给其他类使用

        1.在p层的构造中添加@inject注解并添加v层的参数

        


        2.给v层定义一个对应的module,把自己提供出去

        


        3.创建v层对应的component,与上面不同的事,我们这里需要定义一个module

        


        4.build――>make project,自动生成dagger+***component

        5.调用

        


        可能到这里你还是懵的,怎么调用一下这些方法,就把自己传过去了呢?莫慌,接下来带你去dagger2生成的代码中去看看。

        daggermainactivitycomponent.builder()返回了一个builder

        

        builder是空构造,那么我们继续往下看

        

        .mainactivitymodule(mainactivitymodule(this))把自己传进去,这里
做了一个非空判断之后给成员变量赋值,然后返回builder本身

        

         .build()如果上面传入的值是null,抛异常,否则调用comopent构造并传入builder

        


        

        把builder中的module赋值给component中的module

        

        .inject(this)传入自身(这里的this就是activity本身)

        

        调用injectmainpresenter方法,后面的getmainpresenter拿到presenter对象,然后给activity中@inject注解的presenter赋值

        

        new presenter的时候传入了activity,完成赋值

        

        


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

        总结

        本文只是利用mvp的例子讲解一下dagger2的使用,当然你可以在任何你想要实例化对象的地方用到dagger2,说白了,就是用dagger2代替了new,只需要记得,你想要什么对象,你就在那个对象的构造前面加上@inject注解即可。如果你实例化的对象也需要用到你,那么你就给自己创建一个module提供出去。

        最后附上本文demo的github地址,https://github.com/lxt1994/dagger2demo(本地下载)

        以上纯属于个人平时工作和学习的一些总结分享,如果有什么错误欢迎随时指出,大家可以讨论一起进步。






        

308

主题

782

帖子

706

安币

手工艺人

发表于 2018-4-28 21:37:02 | 显示全部楼层
不错不错,楼主辛苦了。。。

501

主题

1003

帖子

2057

安币

手工艺人

发表于 2018-4-29 06:22:31 | 显示全部楼层
感谢分享,安卓巴士有你更精彩:lol

579

主题

1091

帖子

3282

安币

手工艺人

发表于 2018-4-29 12:34:21 | 显示全部楼层
每次我都积极回帖的,想要安币~

3

主题

7006

帖子

1757

安币

Android大神

Rank: 6Rank: 6

发表于 2018-4-29 17:55:15 | 显示全部楼层
感觉楼主很用心,辛苦啦~

475

主题

963

帖子

5809

安币

手工艺人

发表于 2018-4-29 23:38:47 | 显示全部楼层
楼主是好人,回个帖会有安币吗?

11

主题

9229

帖子

1001

安币

Android大神

Rank: 6Rank: 6

发表于 2018-4-30 06:40:10 | 显示全部楼层
安卓巴士是个不错的网站,我来顶个贴~

0

主题

118

帖子

8

安币

初级码农

Rank: 1

QQ达人

发表于 2018-11-8 16:06:07 | 显示全部楼层
我只是路过打酱油的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站长推荐

通过邮件订阅最新安卓weekly信息
上一条 /4 下一条

下载安卓巴士客户端

全国最大的安卓开发者社区

联系我们
关闭
合作电话:
15618560077
Email:
805941275@qq.com
商务市场合作/投稿
问题反馈及帮助
联系我们

广告投放| 下载客户端|申请友链|手机版|站点统计|安卓巴士 ( 粤ICP备15117877号 )

快速回复 返回顶部 返回列表