詳解Kotlin 中使用和配置 Dagger2
前言
陸陸續(xù)續(xù)幾篇文章已經(jīng)講解了項(xiàng)目中 Kotlin 如何配置、簡(jiǎn)單語(yǔ)法、DataBinding 配置,接下來(lái)就要說(shuō)到 Kotlin 中的 Dagger2 了。
配置 Dagger2
項(xiàng)目中使用 Dagger2 ,首先還是添加依賴。同樣的,因?yàn)橐褂玫阶⒔馓幚?,所以?DataBinding 一樣要添加 kapt 插件:
apply plugin: 'com.android.application' ... apply plugin: 'kotlin-kapt' // kapt 插件 ... kapt { generateStubs = true } dependencies { ... implementation 'com.google.dagger:dagger:2.12' // Dagger 2 依賴 implementation 'com.google.dagger:dagger-android-support:2.12' // Dagger 2 Android 支持包 kapt 'com.google.dagger:dagger-compiler:2.12' // Dagger 2 注解處理 }
配置很簡(jiǎn)單,就這樣完成了。
使用 Dagger2
簡(jiǎn)單的配置完 Dagger2 ,接下來(lái)就是如何在 Android 項(xiàng)目中使用了。參見(jiàn)官方說(shuō)明
首先使 Application 繼承 DaggerApplication,Activity 繼承 DaggerAppCompatActivity,F(xiàn)ragment 繼承 DaggerFragment。
新建一個(gè)接口使用 @Subcomponent 注解繼承 AndroidInjector<YourActivity>,內(nèi)部抽象類使用 @Subcomponent.Builder 注解繼承AndroidInjector.Builder<YourActivity>。
@Subcomponent(modules = arrayOf(...)) // 沒(méi)有其他 Module 圓括號(hào)可省略 interface YourActivitySub : AndroidInjector<YourActivity> { @Subcomponent.Builder abstract class Builder : AndroidInjector.Builder<YourActivity>() }
新建一個(gè)抽象類使用 @Module 注解,用于出入 Activity。
@Module(subcomponents = arrayOf( YourActivitySub::class)) // 每新建一個(gè) Activity,都要新建相應(yīng)的 ActivitySub 接口,并添加到這里 abstract class ActivityModule { @Binds // 每新建一個(gè) Activity,都要添加一個(gè)相應(yīng)方法,方法名不能相同 @IntoMap @ActivityKey(YourActivity::class) abstract fun bindYourActivity(builder: YourActivitySub.Builder): AndroidInjector.Factory<out Activity> }
新建接口 YouApplicationSub 使用 @Component 注解,繼承 AndroidInjector<YourApplication>,內(nèi)部抽象類使用 @Component.Builder 注解繼承 AndroidInjector.Builder<YourApplicaton>。
@Singleton // 如果有 Module 使用了該注解實(shí)現(xiàn)單例模式,這里也需要添加 @Component(modules = arrayOf( ActivityModule::class, // 注入 Activity 的 Module FragmentModule::class, // 注入 Fragment 的 Module ... AndroidSupportInjectionModule::class)) // 確保 DaggerApplication、DaggerActivity、DaggerFragment等所有類型可用 interface ApplicationSub : AndroidInjector<MyApplication> { @Component.Builder abstract class Builder : AndroidInjector.Builder<MyApplication>() }
使你的 Applicatoin 類繼承 DaggerApplication。
class MyApplication : DaggerApplication() { // 如果項(xiàng)目中使用了 v4.Fragment 要繼承 support 包下的 DaggerApplication override fun applicationInjector() : AndroidInjector<out DaggerApplication> { return DaggerApplicationSub.builder().create(this) // 編譯后生成 } }
優(yōu)化
這樣使用是不是很麻煩?在 Dagger2 2.11 版本之前,項(xiàng)目中每添加一個(gè) Activity 或 Fragment 等組件,都要新建一個(gè)對(duì)應(yīng) Subcomponent 接口,并添加到對(duì)應(yīng)的 Module 中,并且添加相應(yīng)的方法。這樣使用起來(lái)太復(fù)雜了。
好在 google 也同樣的意識(shí)到了這個(gè)問(wèn)題,所以在 Dagger2 2.11 版本及其以后,Dagger2 又為我們提供了一個(gè) @ContributesAndroidInjector 注解,大大的簡(jiǎn)化了使用。
首先,使用這個(gè)注解,你需要添加上 Dagger2 注解處理的 Android 支持:
dependencies { ... implementation 'com.google.dagger:dagger:2.12' // Dagger 2 支持 implementation 'com.google.dagger:dagger-android-support:2.12' // Dagger 2 Android 支持 kapt 'com.google.dagger:dagger-compiler:2.12' // Dagger 2 注解處理 kapt 'com.google.dagger:dagger-android-processor:2.12' // Dagger 2 注解處理 Android 支持 ... }
然后,在注入 Activity 的 Module 中改變:
@Module // 不需要再為每個(gè) Activity 新建對(duì)應(yīng)的 Subcomponent,不必再添加到這里 abstract class ActivityModule { @ContributesAndroidInjector abstract fun contributeYourActivity() : YourActivity }
就這樣,是不是簡(jiǎn)潔了很多?之后每添加一個(gè) Activity,只需要在 Activity 添加一個(gè)對(duì)應(yīng)的方法就可以了。
@ContributesAndroidInjector 注解自動(dòng)生成對(duì)應(yīng)的 Subcomponent 而不需要我們手動(dòng)添加。
語(yǔ)法解析
Dagger 2 的配置使用說(shuō)完了,但是相信很多人對(duì)上面的一些語(yǔ)法都不了解,這里來(lái)簡(jiǎn)單說(shuō)明:
// Kotlin 提供的方法,能簡(jiǎn)單快速的生成一個(gè)數(shù)組 val array = arrayOf("1", "2") // 與之類似的還有 arrayListOf() 、 setOf() 等,以后詳細(xì)說(shuō)明 // 類對(duì)象 A::class // 相當(dāng)于 Java 中的 A.class,同時(shí)還有 A.javaClass 相當(dāng)于 Java 中的 A.getClass()
最后
今天的 Kotlin Dagger2 使用就講到這里,接下來(lái)我還會(huì)為大家?guī)?lái)更多的 Kotlin 相關(guān)語(yǔ)法知識(shí)以及基類封裝等。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
android listview進(jìn)階實(shí)例分享
這篇文章主要介紹了android listview進(jìn)階實(shí)例分享,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01Android下載進(jìn)度監(jiān)聽(tīng)和通知的處理詳解
這篇文章主要為大家詳細(xì)介紹了Android下載進(jìn)度監(jiān)聽(tīng)和通知的處理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08Android之ScrollView嵌套ListView和GridView沖突的解決方法
由于ListView,GridView本身都繼承于ScrollView,一旦在ScrollView中嵌套ScrollView,在ScrollView中嵌套使用ListView或者GridView,ListView只會(huì)顯示一行多一點(diǎn)。兩者進(jìn)行嵌套,即會(huì)發(fā)生沖突2013-09-09Android 中 onSaveInstanceState()使用方法詳解
這篇文章主要介紹了Android 中 onSaveInstanceState()使用方法詳解的相關(guān)資料,希望通過(guò)本文大家能夠掌握這部分知識(shí),需要的朋友可以參考下2017-09-09Android開(kāi)發(fā)重寫(xiě)Animation實(shí)現(xiàn)下拉圖片后彈射回去效果示例
這篇文章主要介紹了Android開(kāi)發(fā)重寫(xiě)Animation實(shí)現(xiàn)下拉圖片后彈射回去效果,結(jié)合實(shí)例形式分析了Android自定義類繼承Animation實(shí)現(xiàn)圖片彈射效果的相關(guān)操作技巧,需要的朋友可以參考下2017-10-10Android實(shí)現(xiàn)底部半透明彈出框PopUpWindow效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)底部半透明彈出框PopUpWindow效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07如何正確實(shí)現(xiàn)Android啟動(dòng)屏畫(huà)面的方法(避免白屏)
本篇文章主要介紹了如何正確實(shí)現(xiàn)Android啟動(dòng)屏畫(huà)面的方法(避免白屏),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02Android 中 Activity顯示隱式跳轉(zhuǎn)
這篇文章主要介紹了Android 中 Activity顯示隱式跳轉(zhuǎn)的實(shí)現(xiàn)方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02Android 配置gradle實(shí)現(xiàn)VersionCode自增實(shí)例
今天小編就為大家分享一篇Android 配置gradle實(shí)現(xiàn)VersionCode自增實(shí)例,具有很好的 參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03