国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Dagger2新手入門與使用基礎教程

2019-10-22 18:13:03
字體:
來源:轉載
供稿:網友

前言

前段時間,公司項目使用到了Dagger2,之前自己倒是聽說過Dagger2,但是一直沒有去使用,主要是因為入門難度相對于Rxjava,Retrofit要高不少,個人覺得這個難度并不是指的使用難度,而是一個理解難度。很多人就是代碼照搬,寫一個Component,一個Module就說自己會用Dagger2了,很可能你都不知道為什么你要去寫這些。那么本篇文章將告訴你,Dagger2既然增加了代碼量,那么,我們為什么還要去使用它。

什么是Dagger2

Dagger2是Dagger的升級版,是Android目前最好用的依賴注入框架,在編譯期間自動生成代碼,負責依賴對象的創建。第一代由Square公司共享出來,第二代則是由谷歌接手后推出的。

為什么我要使用Dagger2

我們使用Dagger2的主要目的是降低類與類之間的耦合度,舉個例子。

dagger2使用,dagger2,使用詳解,教程

這里有一個Person類,我們在這個類里面,想使用RichPerson類中的方法,那么我們就需要在Person類中拿到RichPerson的實例,也就是說Person和RichPerson耦合到一起了,違背了單一職責。如果還有很多類都要使用RichPerson類中的方法,那么就會有很多類跟RichPerson這個類耦合起來,一旦RichPerson構造方法變了,比如需要傳入一個id才能使用,那么所有使用RichPerson的類都需要改,這個工作量可不小,而且這樣也違背了開閉原則。
這個時候如果我們使用Dagger2,我們就可以在Person類中通過@Inject的方式拿到RichPerson實例而不需要在Person中去new RichPerson

dagger2使用,dagger2,使用詳解,教程

使用(基于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層對象

dagger2使用,dagger2,使用詳解,教程

這邊gif我就不演示了,單純的吐司提示而已,這種傳統的MVP會在View層去實例化Persenter

2.Dagger2方式MVP

那么用Dagger2的方式,我們應該怎么在V層拿到P層的引用呢?

1.我們需要在P層的構造方法中添加一個@Inject注解,告訴Dagger2,我是可以通過注解拿到的

dagger2使用,dagger2,使用詳解,教程

2.給你任何需要用@Inject注解拿對象的類創建一個Component類,這一步其實就是相當于告訴Dagger2,我這個類需要用到@Inject拿對象哦

dagger2使用,dagger2,使用詳解,教程

3.Build——>Make Project,Dagger2會自動生成Dagger+***Component,比如

dagger2使用,dagger2,使用詳解,教程

4.在V層中通過@Inject和Component拿到實例對象

dagger2使用,dagger2,使用詳解,教程

到此,Dagger2基本使用完畢,我們可以通過@Inject拿到我們想要的任何對象(這個對象的構造方法前面需要添加@Inject),并且不需要new

V層拿P層,P層拿V層

上面的方式,我們可以在V層拿到P層的引用并且去調用P層的方法,那么如果我們需要在P層中拿到V層的對象,該怎么辦呢?給P層也定義一個Component?不是的,這里,我們需要用到一個新的知識點,Module

那么,什么是Module呢,我個人的理解,就是把我本身提供出去,給其他類使用

1.在P層的構造中添加@Inject注解并添加V層的參數

dagger2使用,dagger2,使用詳解,教程

2.給V層定義一個對應的Module,把自己提供出去

dagger2使用,dagger2,使用詳解,教程

3.創建V層對應的Component,與上面不同的事,我們這里需要定義一個Module

dagger2使用,dagger2,使用詳解,教程

4.Build——>Make Project,自動生成Dagger+***Component

5.調用

dagger2使用,dagger2,使用詳解,教程

可能到這里你還是懵的,怎么調用一下這些方法,就把自己傳過去了呢?莫慌,接下來帶你去Dagger2生成的代碼中去看看。

DaggerMainActivityComponent.builder()返回了一個Builder

dagger2使用,dagger2,使用詳解,教程

builder是空構造,那么我們繼續往下看

dagger2使用,dagger2,使用詳解,教程

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

dagger2使用,dagger2,使用詳解,教程

  .build()如果上面傳入的值是null,拋異常,否則調用Comopent構造并傳入builder

dagger2使用,dagger2,使用詳解,教程

dagger2使用,dagger2,使用詳解,教程

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

dagger2使用,dagger2,使用詳解,教程

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

dagger2使用,dagger2,使用詳解,教程

調用injectMainPresenter方法,后面的getMainPresenter拿到presenter對象,然后給activity中@Inject注解的presenter賦值

dagger2使用,dagger2,使用詳解,教程

new Presenter的時候傳入了activity,完成賦值

dagger2使用,dagger2,使用詳解,教程

dagger2使用,dagger2,使用詳解,教程

至此我們的對象實例化完成。

總結

本文只是利用MVP的例子講解一下Dagger2的使用,當然你可以在任何你想要實例化對象的地方用到Dagger2,說白了,就是用Dagger2代替了new,只需要記得,你想要什么對象,你就在那個對象的構造前面加上@Inject注解即可。如果你實例化的對象也需要用到你,那么你就給自己創建一個Module提供出去。

最后附上本文Demo的github地址,https://github.com/lxt1994/Dagger2Demo (本地下載

以上純屬于個人平時工作和學習的一些總結分享,如果有什么錯誤歡迎隨時指出,大家可以討論一起進步。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 昆明市| 桃园市| 临朐县| 宣化县| 永兴县| 天长市| 峨眉山市| 平遥县| 工布江达县| 鄱阳县| 杭锦后旗| 三亚市| 连江县| 德州市| 汉中市| 濉溪县| 虎林市| 读书| 小金县| 金川县| 吴忠市| 德昌县| 定边县| 甘洛县| 新巴尔虎左旗| 获嘉县| 武邑县| 米脂县| 祥云县| 桃园县| 武城县| 华容县| 漯河市| 长岛县| 湘乡市| 许昌市| 大新县| 苏尼特左旗| 象山县| 徐闻县| 刚察县|