Dagger2新手入門與使用基礎(chǔ)教程
前言
前段時(shí)間,公司項(xiàng)目使用到了Dagger2,之前自己倒是聽(tīng)說(shuō)過(guò)Dagger2,但是一直沒(méi)有去使用,主要是因?yàn)槿腴T難度相對(duì)于Rxjava,Retrofit要高不少,個(gè)人覺(jué)得這個(gè)難度并不是指的使用難度,而是一個(gè)理解難度。很多人就是代碼照搬,寫(xiě)一個(gè)Component,一個(gè)Module就說(shuō)自己會(huì)用Dagger2了,很可能你都不知道為什么你要去寫(xiě)這些。那么本篇文章將告訴你,Dagger2既然增加了代碼量,那么,我們?yōu)槭裁催€要去使用它。
什么是Dagger2
Dagger2是Dagger的升級(jí)版,是Android目前最好用的依賴注入框架,在編譯期間自動(dòng)生成代碼,負(fù)責(zé)依賴對(duì)象的創(chuàng)建。第一代由Square公司共享出來(lái),第二代則是由谷歌接手后推出的。
為什么我要使用Dagger2
我們使用Dagger2的主要目的是降低類與類之間的耦合度,舉個(gè)例子。

這里有一個(gè)Person類,我們?cè)谶@個(gè)類里面,想使用RichPerson類中的方法,那么我們就需要在Person類中拿到RichPerson的實(shí)例,也就是說(shuō)Person和RichPerson耦合到一起了,違背了單一職責(zé)。如果還有很多類都要使用RichPerson類中的方法,那么就會(huì)有很多類跟RichPerson這個(gè)類耦合起來(lái),一旦RichPerson構(gòu)造方法變了,比如需要傳入一個(gè)id才能使用,那么所有使用RichPerson的類都需要改,這個(gè)工作量可不小,而且這樣也違背了開(kāi)閉原則。
這個(gè)時(shí)候如果我們使用Dagger2,我們就可以在Person類中通過(guò)@Inject的方式拿到RichPerson實(shí)例而不需要在Person中去new RichPerson

使用(基于Kotlin)
在項(xiàng)目的build.gradle中,添加
apply plugin: 'kotlin-kapt'
dependencies {
kapt 'com.google.dagger:dagger-compiler:2.14.1'
implementation 'com.google.dagger:dagger:2.14.1'
}
這里我們就以MVP模式為例
1.傳統(tǒng)MVP
在View層我們想要去獲取數(shù)據(jù),那么我們就要去通過(guò)構(gòu)造拿到P層對(duì)象

這邊gif我就不演示了,單純的吐司提示而已,這種傳統(tǒng)的MVP會(huì)在View層去實(shí)例化Persenter
2.Dagger2方式MVP
那么用Dagger2的方式,我們應(yīng)該怎么在V層拿到P層的引用呢?
1.我們需要在P層的構(gòu)造方法中添加一個(gè)@Inject注解,告訴Dagger2,我是可以通過(guò)注解拿到的

2.給你任何需要用@Inject注解拿對(duì)象的類創(chuàng)建一個(gè)Component類,這一步其實(shí)就是相當(dāng)于告訴Dagger2,我這個(gè)類需要用到@Inject拿對(duì)象哦

3.Build——>Make Project,Dagger2會(huì)自動(dòng)生成Dagger+***Component,比如

4.在V層中通過(guò)@Inject和Component拿到實(shí)例對(duì)象

到此,Dagger2基本使用完畢,我們可以通過(guò)@Inject拿到我們想要的任何對(duì)象(這個(gè)對(duì)象的構(gòu)造方法前面需要添加@Inject),并且不需要new
V層拿P層,P層拿V層
上面的方式,我們可以在V層拿到P層的引用并且去調(diào)用P層的方法,那么如果我們需要在P層中拿到V層的對(duì)象,該怎么辦呢?給P層也定義一個(gè)Component?不是的,這里,我們需要用到一個(gè)新的知識(shí)點(diǎn),Module
那么,什么是Module呢,我個(gè)人的理解,就是把我本身提供出去,給其他類使用
1.在P層的構(gòu)造中添加@Inject注解并添加V層的參數(shù)

2.給V層定義一個(gè)對(duì)應(yīng)的Module,把自己提供出去

3.創(chuàng)建V層對(duì)應(yīng)的Component,與上面不同的事,我們這里需要定義一個(gè)Module

4.Build——>Make Project,自動(dòng)生成Dagger+***Component
5.調(diào)用

可能到這里你還是懵的,怎么調(diào)用一下這些方法,就把自己傳過(guò)去了呢?莫慌,接下來(lái)帶你去Dagger2生成的代碼中去看看。
DaggerMainActivityComponent.builder()返回了一個(gè)Builder

builder是空構(gòu)造,那么我們繼續(xù)往下看

.mainActivityModule(MainActivityModule(this))把自己傳進(jìn)去,這里
做了一個(gè)非空判斷之后給成員變量賦值,然后返回Builder本身

.build()如果上面?zhèn)魅氲闹凳莕ull,拋異常,否則調(diào)用Comopent構(gòu)造并傳入builder


把Builder中的module賦值給Component中的module

.inject(this)傳入自身(這里的this就是activity本身)

調(diào)用injectMainPresenter方法,后面的getMainPresenter拿到presenter對(duì)象,然后給activity中@Inject注解的presenter賦值

new Presenter的時(shí)候傳入了activity,完成賦值


至此我們的對(duì)象實(shí)例化完成。
總結(jié)
本文只是利用MVP的例子講解一下Dagger2的使用,當(dāng)然你可以在任何你想要實(shí)例化對(duì)象的地方用到Dagger2,說(shuō)白了,就是用Dagger2代替了new,只需要記得,你想要什么對(duì)象,你就在那個(gè)對(duì)象的構(gòu)造前面加上@Inject注解即可。如果你實(shí)例化的對(duì)象也需要用到你,那么你就給自己創(chuàng)建一個(gè)Module提供出去。
最后附上本文Demo的github地址,https://github.com/lxt1994/Dagger2Demo (本地下載)
以上純屬于個(gè)人平時(shí)工作和學(xué)習(xí)的一些總結(jié)分享,如果有什么錯(cuò)誤歡迎隨時(shí)指出,大家可以討論一起進(jìn)步。
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
adnroid已安裝應(yīng)用中檢測(cè)某應(yīng)用是否安裝的代碼實(shí)例
這篇文章主要介紹了Android怎么檢測(cè)一個(gè)應(yīng)用是否安裝的方法,大家參考使用吧2013-11-11
Android UI實(shí)現(xiàn)廣告Banner輪播效果
這篇文章主要為大家詳細(xì)介紹了Android UI實(shí)現(xiàn)廣告Banner輪播效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12
Android 桌面快捷方式實(shí)現(xiàn)實(shí)例詳解
這篇文章主要為大家介紹了Android 桌面快捷方式實(shí)現(xiàn)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
android 控件同時(shí)監(jiān)聽(tīng)單擊和雙擊實(shí)例
這篇文章主要介紹了android 控件同時(shí)監(jiān)聽(tīng)單擊和雙擊實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08
Android視頻播放器屏幕左側(cè)邊隨手指上下滑動(dòng)亮度調(diào)節(jié)功能的原理實(shí)現(xiàn)
這篇文章主要介紹了Android視頻播放器屏幕左側(cè)邊隨手指上下滑動(dòng)亮度調(diào)節(jié)功能的原理實(shí)現(xiàn),非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02
Android實(shí)現(xiàn)通過(guò)手勢(shì)控制圖片大小縮放的方法
這篇文章主要介紹了Android實(shí)現(xiàn)通過(guò)手勢(shì)控制圖片大小縮放的方法,結(jié)合實(shí)例形式分析了Android控制圖片縮放的原理、實(shí)現(xiàn)步驟與相關(guān)操作技巧,需要的朋友可以參考下2016-10-10
Android實(shí)現(xiàn)Recycleview懸浮粘性頭部外加右側(cè)字母導(dǎo)航
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)Recycleview懸浮粘性頭部外加右側(cè)字母導(dǎo)航,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06

