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" } }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。