【问题标题】:Koin injection from constructor in KotlinKotlin 中构造函数的 Koin 注入
【发布时间】:2019-04-06 19:04:09
【问题描述】:

我无法通过 Koin DI 从我的项目的构造函数调用注入。

如果我使用 "... by injection()" 来注入 DataRepository 类,一切都会完美运行。但我想在类的构造函数中提供注入。

我在“repo.addPayment(payment)”行的 CounterPresenter 类中有一个崩溃。 向下看页面。

java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:503)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:964)
 Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:964) 
 Caused by: org.koin.error.NoBeanDefFoundException: No compatible definition found. Check your module definition

这是我的结构:

Koin DI 请问,我怎样才能改变这个模块才能成功工作?

val repositoryModule = module {
    single { PrefsManager() }
    single<IRepository> { DataRepository(get() as LocalRepository) }
    single<ILocalRepository> { LocalRepository(get()) }
}

val databaseModule = module {
    single {
        Room.databaseBuilder(androidApplication(), AppDatabase::class.java, Enviroment.DATABASE_NAME).build()
    }
    single { get<AppDatabase>().getCounterDao() }
}

val presentersModule = module {
    factory { CounterPresenter() }
    factory { SplashPresenter() }
}

类 DataRepository

class DataRepository(private val localRepository: ILocalRepository) : IRepository {

    init {  Log.d("ROMAN", "init DataRepository") }

    override suspend fun addPayment(payment: Int) {
        localRepository.addPayment(payment)
    }
}

类 LocalRepository

class LocalRepository(private val counterDao: CounterDao) : ILocalRepository {

    override suspend fun addPayment(payment: Int) = runBlocking {
        counterDao.insertPayment(Payment(payment))
    }
}

类 CounterPresenter

class CounterPresenter : BasePresenter<CounterContract.View>(), CounterContract.Presenter {
    private val repo: DataRepository by inject()


    override fun onViewCreated() {
        super.onViewCreated()
        launchIO { repo.addPayment(payment) }
    }

【问题讨论】:

  • 请提供详细的堆栈跟踪:Koin 通常显示的不仅仅是“找不到兼容的定义”

标签: android kotlin dependency-injection koin


【解决方案1】:

要向任何类注入依赖项,该类必须实现KoinComponent 接口。(Activity 和 Fragments 除外)

执行此操作,您的代码应该可以正常工作:

class CounterPresenter : BasePresenter<CounterContract.View>(), CounterContract.Presenter, KoinComponent {
    private val repo: DataRepository by inject()


    override fun onViewCreated() {
        super.onViewCreated()
        launchIO { repo.addPayment(payment) }
    }
}

【讨论】:

  • 为我工作。我试图将 dao 的实例注入到存储库类中。只需添加 KoinComponent 并更改导入即可。
猜你喜欢
  • 2020-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多