Android view可以从MVVM中的ViewModel请求数据吗?
我一直在阅读有关MVVM模式的文章Android view可以从MVVM中的ViewModel请求数据吗?,android,mvvm,android-architecture-components,android-architecture,Android,Mvvm,Android Architecture Components,Android Architecture,我一直在阅读有关MVVM模式的文章View应该观察ViewModel中的更改,并据此采取行动,但我不知道在MVVM体系结构中View中的以下代码是否正常 fun onClick(view:View){ showUser(viewModel.getUserDisplayName()) } 这里的View并不是在观察变化,而是在ViewModel中请求最新数据。这在MVVM中被认为是正确的吗?这是一个可能没有唯一答案的问题,因为根据具体的用例可能会有不同的观点。然而: 在我看来,科德萨洛特
View
应该观察ViewModel
中的更改,并据此采取行动,但我不知道在MVVM体系结构中View
中的以下代码是否正常
fun onClick(view:View){
showUser(viewModel.getUserDisplayName())
}
这里的
View
并不是在观察变化,而是在ViewModel
中请求最新数据。这在MVVM中被认为是正确的吗?这是一个可能没有唯一答案的问题,因为根据具体的用例可能会有不同的观点。然而:
在我看来,科德萨洛特爵士(伟大的把手)在技术上是正确的。让我详细说明一下
在MVVM中,视图应将UI交互事件(命令)传递给ViewModel。
以下是微软(mvvm的发明者)的一篇文章:
这里的示例与android无关,但概念应该是相同的,特别是如果您查看第一个图表
ViewModel应该发挥它的魔力,通过相应地操纵数据对这些事件作出反应,然后将状态更改通知观察者(通常是视图)。然后,视图对状态更改作出反应
这样,如果您只是从ViewModel(以同步方式)传回数据,那么您的视图可能会缺少副作用。在您的特定示例中,可能没有任何内容,但是请考虑调用的方法不仅返回数据,还更改一些内部状态(例如,计算访问数据的次数)。那么你的观点就不会知道这些了
当然,您可以证明,您可以返回视图的所有相关数据,但它开始打破单一责任原则
下面是一篇有趣的博文,它可能会给出一个更好的例子,为什么视图总是在ViewModel之后获取状态:
至于另一个例子,维基百科关于MVVM的文章指出,ViewModel可以公开公共属性
因此,如果不直接返回数据,最终可能会更干净。然而,你是架构师,你最了解你的应用程序,可能会有一些模式被破坏的情况。毕竟,它们是指导方针。如果你知道你为什么要打破它(也许会记录下来),那么一切都应该解决 请看这里的答案,这个问题是针对MVP的。在MVP中,presenter持有对view的引用,这样它就可以在view上调用方法,而在MVVM ViewModel中,它对view一无所知@先生对不起,我没注意到。据我所知,在MVVM中,代码应该类似于
viewModel.showUserClicked()
,而viewModel应该处理其背后的逻辑。最好使用数据绑定将单击直接绑定到您的viewModel,就像这样android:onClick=“@{()->viewModel.showUserClicked()”