Как можно внедрить интерактора из ведущего с помощью Koin

Я новичок в Коин. Я все настроил и все работает. Но у меня возникают проблемы, когда я пытаюсь ввести интерактора и ведущего одновременно. Что не уверен, что это возможно.

Это мой модуль

val applicationModule = module(override = true) {
    factory{VoucherImpl(get())}
    factory<VoucherContract.Presenter> { (view: VoucherContract.View) -> VoucherPresenter(view, get()) }


}

Это моя деятельность, в которую вводят ведущего

 private val presenter: VoucherContract.Presenter by inject { parametersOf(this)}

это мой ведущий

class VoucherPresenter (private var view: VoucherContract.View?, private var mCodeRechargeInteract : VoucherImpl) : VoucherContract.Presenter, VoucherContract.Callback, KoinComponent {

    override fun create() {
        view?.initView()
        view?.showProgress()
        mCodeRechargeInteract.run()
    }
.
.
.

Класс интерактора

class VoucherImpl(private var mCallback: VoucherContract.Callback?) : AbstractInteractor() {
.
.
.

договор

interface VoucherContract {


    interface Presenter {
        fun create()
        fun destroy()
        fun checkIfShoppingCartHaveItems()
        fun addVoucherToShoppingCart(voucherProduct: Product)
        fun onItemClick(product: Product)
    }

    interface Callback {
        fun onResponseVouchers(vouchers: List<Product>?)
        fun onError()
    }

}

С этим кодом я получаю

No definition found for 'xxx.voucher.VoucherContract$Callback' has been found. Check your module definitions.

Затем я пытаюсь поместить его в модуль, но не могу, потому что получаю: Несоответствие типа. Требуется VoucherContract.Callback Найдено VoucherImpl

factory<VoucherContract.Callback> { (callBack: VoucherContract.Callback) -> VoucherImpl(callBack) }
0
0
689
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас есть циклическая зависимость, поэтому это не работает.

VoucherImpl(VoucherContract.Callback) и VoucherPresenter(View, VoucherImpl):VoucherContract.Callback

Есть несколько выходов из этого затруднительного положения. Я бы рекомендовал следующие изменения: VoucherImpl не должен иметь параметр конструктора VoucherContract.Callback. Этот обратный вызов должен быть параметром метода примерно так:

class VoucherImpl : AbstractInteractor(){
  fun listen(VoucherContract.Callback){...}
}

Таким образом, зависимость становится односторонней, и вы можете вводить их.

Поступая таким образом, мне нужно инициализировать параметр с помощью laeinit, чтобы его можно было использовать во всем классе. Затем, как я могу установить обратный вызов равным нулю, чтобы уничтожить обратный вызов, потому что laeinit не может быть установлен равным нулю: private lateinit var mCallback: VoucherContract.Callback // fun listen(callback: VoucherContract.Callback){this.mCallback = callback } // переопределить fun removeCallbacks () { mCallback = null } Или будет удалено, когда действие, обрабатывающее этот класс, будет уничтожено?

S.P. 15.06.2019 12:47

Возможно, прочитайте здесь: developer.android.com/jetpack/docs/guide Это поможет вам иметь более реактивную архитектуру с чистыми зависимостями.

jbarat 15.06.2019 13:36

Другие вопросы по теме