我尝试学习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>)
}
}
答案 0 :(得分:4)
我们要问的第一个问题是,主持人应该向谁返回价值?谁对演示者的价值感兴趣?我们想用视图层搞乱我们的业务逻辑吗?鉴于我们的业务逻辑在演示者本身内部,还有谁对任何数据感兴趣?
绝对不是我们的意图而是从MVP转移。 我们需要通过接口传播值,通常是View层方法,并将它们作为参数传递给驻留在视图层中的其他感兴趣的各方。
答案 1 :(得分:1)
TL; DR:选项#2
这是一个自以为是的答案,但我通常会尝试向演示者注入某种抽象的view
引用。基本上是一个接口,其中实际的实现可以是活动,片段或视图,但对于演示者而言,这并不重要。所有它知道的,是界面提出的合同。
答案 2 :(得分:1)
我倾向于不会从演示者那里返回值。我会向获取产品的演示者注入另一个抽象。我们通常称他们为互动者。它的职责是从后台线程上的存储库中获取并在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)
}
}