Kotlin中使用Dagger2可能遇到的坑解决
程序员文章站
2023-11-13 13:50:58
dagger2是什么?
dagger2是一款基于java注解,在编译阶段完成依赖注入的开源库,主要用于模块间解耦,方便进行测试。
一、kotlin dagger2 配置...
dagger2是什么?
dagger2是一款基于java注解,在编译阶段完成依赖注入的开源库,主要用于模块间解耦,方便进行测试。
一、kotlin dagger2 配置
build.gradle
apply plugin: 'com.android.library' apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' ... dependencies { ... //dagger2 compile rootproject.ext.dependencies["dagger"] kapt rootproject.ext.apt["dagger-compiler"] //dagger2 android 一个dagger2 关于android的增强库 可选项 compile rootproject.ext.dependencies["dagger-android"] //可选项 compile rootproject.ext.dependencies["dagger-android-support"] //可选项 kapt rootproject.ext.apt["dagger-android-processor"] }
appcomponent
@singleton @component(modules = arrayof(appmodule::class)) interface appcomponent { fun inject(app: baseapplication) }
appmodule
@module class appmodule(val app: application) { @provides @singleton fun provideapplication() = app }
application
class baseapplication : application() { override fun oncreate() { super.oncreate() initapplication() daggercorecomponent .builder() .coremodule(coremodule(this)) .build(); } }
以上配置完成,就可以愉快的在kotlin中使用dagger2了。
更多关于kotlin dagger2配置的内容可以参考这里:
二、kotlin使用dagger2遇到的坑
当时我想将presenter注入到activity中,代码如下,make projiect的时候不通过 百思不得其解
坑1
class mainactivity : appcompatactivity() ,maincontract.view { @inject var mpresenter : maincontract.presenter ? = null override fun oncreate(savedinstancestate: bundle?) { //******// super.oncreate(savedinstancestate) daggermainactivitycomponent.builder().build().inject(this) mpresenter?.subscribe() } @module inner class presentermodules { @provides fun providepresenter(): maincontract.presenter { return mainpresenter(this@mainactivity) } } } @component(modules = arrayof(mainactivity.presentermodules::class)) interface mainactivitycomponent { fun inject(activity: mainactivity) }
然后我将kotlin 代码 转成字节码后再转成java代码,发现presenter是私有的.
而我们都知道,注入的对象不可以是私有的
public final class mainactivity extends appcompatactivity implements view { @inject @nullable private presenter mpresenter; -----省略 }
//于是将上述代码改成 @inject @jvmfield var mpresenter : maincontract.presenter ? = null //或则 @inject lateinit mpresenter : maincontract.presenter
即可编译成功
坑2
@inject @jvmfield // @named("preneter")// 错误 正确的做法如下 @field:[named("preneter")] var mpresenter : maincontract.presenter ? = null
@module inner class presentermodules { @provides @named("preneter") fun providepresenter(): maincontract.presenter { return mainpresenter(this@mainactivity) } @provides @named("hello") fun provide():string{ return "hello" } }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
上一篇: C#获取并修改文件扩展名的方法
下一篇: HTML学习之轮播图
推荐阅读