欢迎来到代码驿站!

Android代码

当前位置:首页 > 移动开发 > Android代码

Kotlin中使用Dagger2可能遇到的坑解决

时间:2021-11-27 13:46:17|栏目:Android代码|点击:

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配置的内容可以参考这里:https://www.jb51.net/article/126973.htm

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

总结

上一篇:解析在Android中为TextView增加自定义HTML标签的实现方法

栏    目:Android代码

下一篇:在Android中查看当前Activity是否销毁的操作

本文标题:Kotlin中使用Dagger2可能遇到的坑解决

本文地址:http://www.codeinn.net/misctech/184992.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有