【问题标题】:How can inject interactor from presenter with Koin如何使用 Koin 从演示者注入交互器
【发布时间】:2019-06-29 18:46:58
【问题描述】:

我是 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) }

【问题讨论】:

    标签: android kotlin koin


    【解决方案1】:

    你有一个循环依赖,这就是为什么这不起作用。

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

    有多种方法可以摆脱这种困境。 我建议进行以下更改: VoucherImpl 不应具有构造函数参数VoucherContract.Callback。这个回调应该是这样的方法的参数:

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

    这样依赖就变成了一种方式,你可以注入它们。

    【讨论】:

    • 这样做,我需要用laeinit初始化参数才能在全班使用。那么,如何将回调设置为null来销毁回调,因为不能将laeinit设置为null: private lateinit var mCallback: VoucherContract.Callback // fun listen(callback: VoucherContract.Callback){this.mCallback = callback } //override fun removeCallbacks() { mCallback = null } 或者当处理这个类的activity被销毁时会被remove?
    • 也许可以在这里阅读:developer.android.com/jetpack/docs/guide 这将帮助您拥有一个具有清晰依赖关系的更具反应性的架构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-01
    • 2010-10-05
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多