Android 在MVP中使用Kotlin高阶函数

Android 在MVP中使用Kotlin高阶函数,android,kotlin,android-mvp,Android,Kotlin,Android Mvp,通常使用Java,我们会制作一个*契约接口来处理视图和演示者之间的交互,如: 主要活动 作为视图 public class MainActivity extends Activity implements MainContract { @Override public void onCreate(Bundle b) { presenter.requestData(); } @Override public void showData(String data) { // Handl

通常使用Java,我们会制作一个
*契约
接口来处理视图演示者之间的交互,如:

主要活动
作为
视图

public class MainActivity extends Activity implements MainContract {

@Override
public void onCreate(Bundle b) {
   presenter.requestData();
}

@Override
public void showData(String data) {
   // Handle data ...
}
主演示者
作为演示者

public class MainPresenter {

   public void requestData() {
      contract.showData("data");
   }
}
主合同
作为
接口

public interface MainContract {
   void showData(String data);
}
由于Kotlin具有“高阶函数”的功能,我们是否应该传递函数来处理视图和演示者之间的交互?它可以是这样的:

视图:

演示者:

fun requestData(handler: (String) -> Unit) {
   handler("data")
}

我不是在问这种可能性,我是在问这是否是一种最佳实践。

这个问题的答案更多的是相关的架构决策,而不是技术限制。您可以使用匿名实例在Java(甚至在Java7中)中实现同样的事情(假定它会有更多的样板文件,并且更难阅读)

MVP中视图实现的契约的思想是,每个演示者都知道如何获取、操作和呈现所述契约。一个视图可能会实现多个协定并具有多个演示者。此外,每个presenter实例仅适用于一个契约实现,但您可以有两个实例服务于两个不同的实现

如果不是每个视图都符合每个演示者的约定,而是演示者的每次调用都会占用lambda,那么迟早您会遇到问题

例如,假设演示者异步获取数据并将其缓存在内存中:

  • 视图调用presenter方法
    fetchData()
  • 演示者调用合同的
    showLoading()
    方法
  • (一些时间过去了)
  • 演示者调用合同的
    hideLoading()
    showData(data)
    方法
  • 用户再次交互并触发
    fetchData()
  • 演示者使用缓存的数据调用
    showData()
  • 在这种情况下,如果我们使用lambda而不是契约,我们将需要在同一方法中请求两个不同的lambda:一个用于缓存时,另一个用于不缓存时。 我们还将视图实现耦合到presenter,将来presenter接口的另一个实现可能不需要这两个lambda,因为逻辑已经更改

    重要的是要记住,在MVP中,理想情况下,视图和演示者都通过接口相互通信,在这种情况下,演示者接口不应该受到实现细节的影响,而应该公开它们能够执行的操作

    fun requestData(handler: (String) -> Unit) {
       handler("data")
    }