前言:本文不会介绍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)
}
}