Я новичок в Коин. Я все настроил и все работает. Но у меня возникают проблемы, когда я пытаюсь ввести интерактора и ведущего одновременно. Что не уверен, что это возможно.
Это мой модуль
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) }
У вас есть циклическая зависимость, поэтому это не работает.
VoucherImpl(VoucherContract.Callback) и VoucherPresenter(View, VoucherImpl):VoucherContract.Callback
Есть несколько выходов из этого затруднительного положения.
Я бы рекомендовал следующие изменения:
VoucherImpl не должен иметь параметр конструктора VoucherContract.Callback. Этот обратный вызов должен быть параметром метода примерно так:
class VoucherImpl : AbstractInteractor(){
fun listen(VoucherContract.Callback){...}
}
Таким образом, зависимость становится односторонней, и вы можете вводить их.
Возможно, прочитайте здесь: developer.android.com/jetpack/docs/guide Это поможет вам иметь более реактивную архитектуру с чистыми зависимостями.
Поступая таким образом, мне нужно инициализировать параметр с помощью laeinit, чтобы его можно было использовать во всем классе. Затем, как я могу установить обратный вызов равным нулю, чтобы уничтожить обратный вызов, потому что laeinit не может быть установлен равным нулю: private lateinit var mCallback: VoucherContract.Callback // fun listen(callback: VoucherContract.Callback){this.mCallback = callback } // переопределить fun removeCallbacks () { mCallback = null } Или будет удалено, когда действие, обрабатывающее этот класс, будет уничтожено?