android - view 在 MVVM 中向 ViewModel 请求数据是否可以?

标签 android mvvm android-architecture-components android-architecture

我一直在阅读有关 MVVM 模式的内容。 View 应该观察 ViewModel 中的变化并据此采取行动,但如果 View 中的以下代码在 MVVM 架构中是否正常,我感到困惑。

fun onClick(view:View){
    showUser(viewModel.getUserDisplayName())
}

这里 View 不是在观察变化,而是从 ViewModel 请求最新数据。这在 MVVM 中是否正确?

最佳答案

这是一个可能没有唯一答案的问题,因为可能会根据具体用例提出不同的观点。然而:

我认为 Codesalot 爵士(出色的把柄)在技术上是正确的。让我详细说明。

在 MVVM 中, View 应将 UI 交互事件(命令)传递给 ViewModel。 这是微软(mvvm 的发明者)的一篇文章:https://msdn.microsoft.com/en-us/library/ff798384.aspx 这里的示例与 android 无关,但概念应该相同,尤其是如果您查看第一张图。

ViewModel 应该发挥它的魔力,通过相应地操作数据来对这些事件使用react,然后将状态更改通知观察者(通常是 View )。然后 View 对状态变化使用react。

这样,如果您只是将数据从 ViewModel 传回(以同步方式),那么您的 View 可能会缺少副作用。在您的特定示例中,可能没有,但请考虑您调用的方法不仅返回数据,而且还会更改某些内部状态(例如,计算访问数据的次数)。那么你的 View 将不知道这些。

当然,您可以证明您可以返回 View 的所有相关数据,但这开始打破单一责任原则。

这是一篇有趣的博客文章,它可能会提供一个更好的例子,为什么 View 应该总是在 ViewModel 之后获取状态:https://medium.com/upday-devs/mvvm-rxjava-learnings-1819423f9592

另一种情况,关于 MVVM 的维基百科文章 https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel指出,ViewModel 可以公开公共(public)属性。

所以最后,如果你不直接返回数据,它很可能会更干净。但是,您是架构师,您最了解您的应用程序,并且在某些情况下可能会打破模式。毕竟它们是指南。如果您知道为什么要破坏它(并可能记录下来),那么一切都会顺利进行。

关于android - view 在 MVVM 中向 ViewModel 请求数据是否可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50343428/

相关文章:

java - Android 处理具有动态 Activity 的线程

android - 在 kotlin 中如何为 recyclerview 适配器设置点击事件

android - 访问共享首选项存储库中的 appcontext(架构)

java - 当点击从 WorkManager 发送的通知时,使用导航组件启动特定 fragment

android - Firebase 云消息传递到底是什么?

android - 如何在 fragment 内的 webview 中控制导航历史记录

Android ViewModel 无法在 fragment 更改后继续存在

c# - 保存 RichTextBox 的文本

c# - 如何将前景绑定(bind)到我的 ViewModel 中的属性?

android - 为什么 LiveData 还要通知处于 onPause 状态的 Activity?