Инъекция коинов от конструктора в Котлине

1

Я не могу вызвать инжект из конструктора для моего проекта через 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

Вот моя структура:

Изображение 174551

Коин Д.И. Пожалуйста, как мне изменить этот модуль для успешной работы?

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) }
    }
Теги:
kotlin
dependency-injection
koin

1 ответ

0

Чтобы внедрить зависимости в любой класс, класс должен реализовывать интерфейс 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) }
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню