Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android view可以从MVVM中的ViewModel请求数据吗?_Android_Mvvm_Android Architecture Components_Android Architecture - Fatal编程技术网

Android view可以从MVVM中的ViewModel请求数据吗?

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中被认为是正确的吗?这是一个可能没有唯一答案的问题,因为根据具体的用例可能会有不同的观点。然而: 在我看来,科德萨洛特

我一直在阅读有关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()”