(Android) 在Kotlin項目中使用Dagger2

前言:本文不會介紹Dagger2如何使用,假設大家已經能夠在java項目中使用dagger2

今天在kotlin項目中配置了一下dagger2,發現和java中略有不同,寫篇文章記錄一下。

項目配置

首先,我們需要在gradle file裏面配置kapt。如果在java中使用過dagger,肯定知道apt,apt是一個gradle插件,協助Android Studio 處理annotation processors。dagger就是依靠編譯時註解生成輔助類,在需要時來get到你需要的object的。kapt就是apt的kotlin版本。

1.需要在build.gradle中加入,放到denpencies section上面就可以

kapt {
    generateStubs = true
}

2.加入kotlin plugin

apply plugin: 'kotlin-kapt'

3.加入denpencies

//dagger2
    kapt 'com.google.dagger:dagger-compiler:2.5'
    implementation 'com.google.dagger:dagger:2.5'

以上,就是需要的配置

配置module和component

先從module開始

新建一個AppModule,這裏我們提供兩個對象,一個是application context,一個是appManager對象

@Module
class AppModule(private val app: BaseApp) {

    @Singleton
    @Provides
    fun provideApplicationContext():Context = app.applicationContext

    @Singleton
    @Provides
    fun provideAppManager():AppManager= AppManager()

}

實現一個component,加入我們剛纔創建的module

@Singleton
@Component(modules = [(AppModule::class)])
interface AppComponent {
    fun inject(baseApp: BaseApp)
    fun inject(mainActivity: MainActivity)
}

在Application類中,初始化dagger component。在這之前,需要make project一下,以便dagger生成DaggerAppComponent這個類。如下代碼,定義appComponent爲companion object,類似java中的static對象,並且使用了lateinit關鍵字,自行稍後init。接着在initDagger方法appComponent

class BaseApp : Application() {

    companion object {
        //platformStatic allow access it from java code
        @JvmStatic lateinit var appComponent: AppComponent
    }


    override fun onCreate() {
        super.onCreate()
        initDagger()
        this.registerActivityLifecycleCallbacks(ActivityLifeCycle())
    }

    private fun initDagger(){
        appComponent =  DaggerAppComponent.builder().appModule(AppModule(this)).build()
    }

}

在MainActivity中使用注入對象,這就比較簡單了,inject注入對象,並且在onCreate方法中inject這個activity,這樣就可以使用appManager這個對象了。

class MainActivity : AppCompatActivity() {
    @Inject
    lateinit var appManager:AppManager
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        BaseApp.appComponent.inject(this)
        
    }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章