android - 从 Kotlin 中的构造函数注入(inject) Koin

标签 android kotlin dependency-injection koin

我无法通过 Koin DI 为我的项目调用构造函数注入(inject)。

如果我使用“... by inject()”来注入(inject) DataRepository 类,一切都会完美无缺。但是我想在一个类的构造函数中提供注入(inject)。

我在“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

这是我的结构:

enter image description here

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

类本地存储库

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

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

CounterPresenter 类(class)

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


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

最佳答案

要向任何类注入(inject)依赖项,该类必须实现 KoinComponent 接口(interface)。(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) }
    }
}

关于android - 从 Kotlin 中的构造函数注入(inject) Koin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55552501/

相关文章:

java - 如何在java中创建具有默认GMT时间的日历

android - 无法解决java.lang.IndexOutOfBoundsException : Invalid index 1, size is 0

java - 如何在Instant Apps中实现Multi Dex?

c# - 告诉 Resharper 使用 spring.net DI 配置来检查未使用的类?

c# - 从主视图部分 View 访问 Ninject 对象

android - Cordova/Phonegap 文件传输插件

安卓教程 'HelloTabWidget'

dictionary - 如何访问模板字符串中的 map ?

kotlin - Kotlin 空安全是否在编译器中实现?

c# - 覆盖 NServiceBus 中的依赖项