首页 > 开发 > 其他 > 正文

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

2019-10-20 15:57:21
字体:
来源:转载
供稿:网友

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

@Moduleclass 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遇到的坑

当时我想将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//或则@Injectlateinit 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" } }

总结

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


注:相关教程知识阅读请移步到kotlin教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表