(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)
        
    }
}



猜你喜欢

转载自blog.csdn.net/zhouy1989/article/details/80696769