【问题标题】:How to send actions from View to ViewModel in MVVM architecture in Android如何在 Android 的 MVVM 架构中将动作从 View 发送到 ViewModel
【发布时间】:2019-07-17 17:50:39
【问题描述】:

你好! 我正在努力提高我的 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 函数?

【问题讨论】:

  • 您是否正在寻找两种方式的数据绑定。就像 viewmodel 需要知道用户是否在 edttext 中输入了某些内容并单击了按钮。如果是这样,请搜索两种方式的数据绑定。 developer.android.com/topic/libraries/data-binding/two-way
  • 感谢您提供此链接,但我现在尝试不使用数据绑定。 I对我来说,使用数据绑定比没有它创建干净的架构更容易。因此,出于教育目的,在我当前的项目中禁止数据绑定。不过谢谢,我不知道Databinding的这个功能。
  • 你还在迷茫吗?你得到答案了吗?

标签: android mvvm architecture android-architecture-components


【解决方案1】:

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

Source - ViewModel Patterns/Anti Patterns

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

引用自文档:

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

【讨论】:

  • 我是对的,我可以从视图中调用 viewModels 函数吗?例如,下面的代码很干净,对吧? pastebin.com/k2SVtUJF
  • @VladimirVechkanov 是的,除非您不传递活动上下文或任何与视图相关的内容,否则您可以这样做
  • 是的,它是安全的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-28
  • 1970-01-01
  • 2017-10-24
  • 1970-01-01
  • 1970-01-01
  • 2015-05-19
  • 1970-01-01
相关资源
最近更新 更多