欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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"
 }
 }

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。