繁体   English   中英

在Android MVP中,演示者应该返回一个值吗?

[英]In Android MVP, should a presenter return a value?

我试着学习MVP,我有一些问题要问,演示者是否应该返回一个值?

这样的事情:

class MainPresenter : BasePresenter<MainContract.View>(), MainContract.Actions {
    override fun getProducts (id: Int): List<Product> {
        //...
        return products
    }
}

interface MainContract {
    interface Actions {
        fun getProducts(id: Int): List<Product>
    }
}

或者像这样:

class MainPresenter : BasePresenter<MainContract.View>(), MainContract.Actions {
    override fun getProducts (id: Int) {
        //...
        mvpView?.showProducts(products)
    }
}

interface MainContract {
    interface Actions {
        fun getProducts(id: Int)
    }

    interface View{
        fun showProducts(products: List<Product>)
    }
}

我们要问的第一个问题是,主持人应该向谁返回价值? 谁对演示者的价值感兴趣? 我们想用视图层搞乱我们的业务逻辑吗? 鉴于我们的业务逻辑在演示者本身内部,还有谁对任何数据感兴趣?

绝对不是我们的意图,而是偏离MVP。 我们需要通过接口传播值,通常是View层方法,并将它们作为参数传递给驻留在视图层中的其他感兴趣的各方。

TL; DR:选项#2

这是一个自以为是的答案,但我通常会尝试向演示者注入某种抽象view引用。 基本上是一个接口,其中实际的实现可以是活动,片段或视图,但对于演示者而言,这并不重要。 所有它知道的,是界面提出的合同。

我倾向于不会从演示者那里返回值。 我会向获取产品的演示者注入另一个抽象。 我们通常称他们为互动者。 它的职责是从后台线程上的存储库中获取并在main上传递结果。 回调的经典方式看起来像这样(但你应该考虑使用kotlin协程,这样可以避免回调):

class MainPresenter(val interactor: MainInteractor) : BasePresenter<MainContract.View>(), MainContract.Actions, MainContract.Interactor.Callback {
    override fun getProduct (id: Int) {
        //...
        interactor.getProduct(product, this) // this is the callback
    }

    override fun onResult(result: Product) {
        mvpView?.showProduct(result)
    }
}

interface MainContract {
    interface Interactor {
        interface Callback<T> { fun onResult(result: T) }
        fun getProduct(id: Int, listener: Callback<Product>)
    }

    interface View{
        fun showProduct(product: Product)
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM