Kotlin中使用Dagger2可能遇到的坑解决
Dagger2是什么?
Dagger2是一款基于Java注解,在编译阶段完成依赖注入的开源库,主要用于模块间解耦,方便进行测试。
一、KotlinDagger2配置
build.gradle
applyplugin:'com.android.library'
applyplugin:'kotlin-android'
applyplugin:'kotlin-kapt'
...
dependencies{
...
//dagger2
compilerootProject.ext.dependencies["dagger"]
kaptrootProject.ext.apt["dagger-compiler"]
//dagger2android一个dagger2关于Android的增强库可选项
compilerootProject.ext.dependencies["dagger-android"]
//可选项
compilerootProject.ext.dependencies["dagger-android-support"]
//可选项
kaptrootProject.ext.apt["dagger-android-processor"]
}
AppComponent
@Singleton
@Component(modules=arrayOf(AppModule::class))
interfaceAppComponent{
funinject(app:BaseApplication)
}
AppModule
@Module
classAppModule(valapp:Application){
@Provides
@Singleton
funprovideApplication()=app
}
Application
classBaseApplication:Application(){
overridefunonCreate(){
super.onCreate()
initApplication()
DaggerCoreComponent
.builder()
.coreModule(CoreModule(this))
.build();
}
}
以上配置完成,就可以愉快的在Kotlin中使用Dagger2了。
更多关于KotlinDagger2配置的内容可以参考这里:https://www.nhooo.com/article/126973.htm
二、Kotlin使用Dagger2遇到的坑
当时我想将presenter注入到Activity中,代码如下,makeProjiect的时候不通过百思不得其解
坑1
classMainActivity:AppCompatActivity(),MainContract.View{
@Inject
varmPresenter:MainContract.Presenter?=null
overridefunonCreate(savedInstanceState:Bundle?){
//******//
super.onCreate(savedInstanceState)
DaggerMainActivityComponent.builder().build().inject(this)
mPresenter?.subscribe()
}
@Module
innerclassPresenterModules{
@Provides
funprovidePresenter():MainContract.Presenter{
returnMainPresenter(this@MainActivity)
}
}
}
@Component(modules=arrayOf(MainActivity.PresenterModules::class))
interfaceMainActivityComponent{
funinject(activity:MainActivity)
}
然后我将kotlin代码转成字节码后再转成java代码,发现Presenter是私有的.
而我们都知道,注入的对象不可以是私有的
publicfinalclassMainActivityextendsAppCompatActivityimplementsView{
@Inject
@Nullable
privatePresentermPresenter;
-----省略
}
//于是将上述代码改成 @Inject @JvmField varmPresenter:MainContract.Presenter?=null //或则 @Inject lateinitmPresenter:MainContract.Presenter
即可编译成功
坑2
@Inject
@JvmField
//@Named("preneter")//错误正确的做法如下
@field:[Named("preneter")]
varmPresenter:MainContract.Presenter?=null
@Module
innerclassPresenterModules{
@Provides
@Named("preneter")
funprovidePresenter():MainContract.Presenter{
returnMainPresenter(this@MainActivity)
}
@Provides
@Named("hello")
funprovide():String{
return"hello"
}
}
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。