您好,登錄后才能下訂單哦!
這篇文章主要介紹了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中,添加
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,完成賦值
至此我們的對象實例化完成。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Dagger2如何使用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。