如何在Android的MVVM架构中将动作从View发送到ViewModel

时间:2019-07-17 17:50:39

标签: android mvvm architecture android-architecture-components

地狱! 我正在努力提高自己的Android体系结构技能。我发现这个article表示在视图中调用viewModels函数是一种不好的做法。

例如,以这种方式调用函数是不好的做法。

override fun onClick(v: View?) {
    if (v == vk_login) {
        loginViewModel.onVKLoginClick()
    }
}

我了解如何使用LiveData从ViewModel到View传输数据和动作。为此,我们在视图中初始化LiveData。但是我找不到任何信息,该如何从视图中使用LiveData(或类似方式)发送用户操作信息。

我应该在视图中初始化LiveData并为其订阅视图模型(听起来很奇怪)。

或者像这样使用smth更好:

loginViewModel.nameFromUser.value = "some name from text view"

或者我发现的文章是错误的并且可以从视图中调用viewModels函数吗?

1 个答案:

答案 0 :(得分:2)

ViewModel绝不能包含对Android框架的引用,更不要说视图了,否则将导致内存泄漏。最好像这样使用loginViewModel.nameFromUser.value = "some name from text view"

DEMO

Source - ViewModel Patterns/Anti Patterns

视图可以观察实时数据,但是ViewModel无法观察视图,因为视图不会发出LiveData对象。

从文档中引用:

  

警告:ViewModel绝不能引用视图,生命周期或任何可能包含对活动上下文的引用的类。 ViewModel对象旨在使视图或LifecycleOwners的特定实例寿命更长