Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 来自Kotlin中构造函数的Koin注入_Android_Kotlin_Dependency Injection_Koin - Fatal编程技术网

Android 来自Kotlin中构造函数的Koin注入

Android 来自Kotlin中构造函数的Koin注入,android,kotlin,dependency-injection,koin,Android,Kotlin,Dependency Injection,Koin,我不能通过Koin DI为我的项目从构造函数调用inject 如果我使用“…by inject()”来注入DataRepository类,所有这些都可以完美地工作。但是我想在类的构造函数中提供inject 我在“repo.addPayment(payment)”行中的对应方类中有一个崩溃。 往下看这一页 java.lang.RuntimeException: java.lang.reflect.InvocationTargetException at com.android.intern

我不能通过Koin DI为我的项目从构造函数调用inject

如果我使用“…by inject()”来注入DataRepository类,所有这些都可以完美地工作。但是我想在类的构造函数中提供inject

我在“repo.addPayment(payment)”行中的对应方类中有一个崩溃。 往下看这一页

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() }
}
本地存储库类

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))
    }
}
班级对应者

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


    override fun onViewCreated() {
        super.onViewCreated()
        launchIO { repo.addPayment(payment) }
    }
class CounterPresenter:BasePresenter(),CounterContract.Presenter{
私有val repo:inject()的数据存储库
重写onViewCreated(){
super.onViewCreated()
launchIO{repo.addPayment(payment)}
}

若要向任何类注入依赖项,该类必须实现
KoinComponent
接口。(活动和片段除外)

执行此操作后,您的代码应能正常工作:

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


    override fun onViewCreated() {
        super.onViewCreated()
        launchIO { repo.addPayment(payment) }
    }
}
类对方提交人:BasePresenter(),CounterContract.Presenter,KoinComponent{
私有val repo:inject()的数据存储库
重写onViewCreated(){
super.onViewCreated()
launchIO{repo.addPayment(payment)}
}
}

请提供详细的stacktrace:Koin通常显示的不仅仅是“找不到兼容的定义”对我有效。我试图将dao实例注入到存储库类中。只是添加了KoinComponent并更改了导入,就成功了。