Android MVVM startActivity 最佳实践

新手上路,请多包涵

我正在使用 MVVM 和 DataBinding 构建一个 Android 应用程序。我的 ViewModel 中有一个启动 Activity 的函数。在 ViewModel 中调用 onClick 可以吗?

像这样。

 public class MyViewModel {
    public void onClick(View view, long productId) {
        Context context = view.getContext();
        Intent intent = new Intent(context, ProductDetailActivity.class);
        intent.putExtra("productId", productId);
        context.startActivity(intent);
    }
}

在我的 XML 中:

 ...
android:onClick="@{(v) -> viewModel.onClick(v, viewModel.product.id)}">

或者将它移动到 View 并从 EventBus 或 Rx 调用它并且在我的 ViewModel 中只有 POJO 是最佳实践吗?

原文由 Felipe Kenji Shiba 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 742
2 个回答

你的问题的答案是你的目标是什么?

如果您想使用 MVVM 来分离关注点,以便您可以对您的 Viewmodel 进行单元测试,那么您应该尝试将需要 Context 的所有内容与您的 Viewmodel 分开 ---Viewmodel 包含您应用程序的核心业务逻辑,应该没有外部依赖项。

但是我喜欢你要去的地方 :) 如果打开哪个 Activity 的决定在于视图,那么为它编写 JUnit 测试就非常非常困难。但是,您可以将对象传递给 Viewmodel 执行 startActivity() 调用。现在在你的 单元测试 中,你可以简单地模拟这个对象并验证是否打开了正确的 Activity

原文由 Kaskasi 发布,翻译遵循 CC BY-SA 3.0 许可协议

我这样做的方式是,在您的 ViewModel 中:

 val activityToStart = MutableLiveData<Pair<KClass<*>, Bundle?>>()

这允许您检查启动的 Activity 类,以及 Bundle 中传递的数据。然后,在您的 Activity 中,您可以添加以下代码:

 viewModel.activityToStart.observe(this, Observer { value ->
    val intent = Intent(this, value.first.java)
    if(value.second != null)
        intent.putExtras(value.second)
    startActivity(intent)
})

原文由 user2058839 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题