Я не могу вызвать инжект из конструктора для моего проекта через Koin DI.
Если я использую " ... by inject() " для внедрения класса DataRepository, все работает отлично. Но я хочу предоставить inject в конструкторе класса.
У меня происходит сбой в классе CounterPresenter в строке " 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
Вот моя структура:
Коин Д.И. Пожалуйста, как мне изменить этот модуль для успешной работы?
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) }
}
Чтобы внедрить зависимости в любой класс, класс должен реализовывать интерфейс 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) }
}
}