在Android MVP中,一个Presenter应该返回一个值吗?

3

我想学习 MVP,我有一些问题要问,一个 Presenter 应该返回一个值吗?

类似这样:

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>)
    }
}
3个回答

4

我们首先要问的问题是,演示者应该把价值返回给谁?谁对演示者的价值感兴趣?我们想在视图层中混杂我们的业务逻辑吗?考虑到我们的业务逻辑已经在演示者本身内部,还有谁对任何数据感兴趣呢?

显然这不是我们的意图,而且偏离了MVP的思想。我们需要通过接口传播价值,通常是通过视图层方法将它们传递给其他位于视图层中的感兴趣的方。


在我的情况下,返回值是用于创建适配器的产品列表,所以你基本上是说第二个选项更可取? - nyongrand
简短而明确的答案是“是”。第二个选项是正确的选择。 - Nikola Despotoski

1

太长不看:选项 #2

这是一个主观的答案,但通常我会尝试向Presenter注入一些抽象的view引用。基本上,是一个接口,其中实际实现可以是Activity、Fragment或View,但对于Presenter来说并不重要。它所知道的就是接口呈现的合同。


1
我倾向于不从我的Presenter返回值。我会在Presenter中注入另一个抽象层来获取产品。我们通常称之为“Interactor”。它的职责是在后台线程从存储库中获取数据,并在主线程上传递结果。使用回调的经典方式如下(但您应该考虑改用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)
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接