【问题标题】:Should livedata be always used in ViewModel?在 ViewModel 中应该始终使用 livedata 吗?
【发布时间】:2021-01-13 10:33:38
【问题描述】:

看起来recommended viewmodel 中的字段模式是:

val selected = MutableLiveData<Item>()

fun select(item: Item) {
    selected.value = item
}

(顺便说一句,selected 字段不是私有的是否正确?)

但是,如果我不需要订阅 ViewModel 字段中的更改,该怎么办。我只需要被动地将该值拉到另一个片段中。

我的项目详情:

  • 一个活动和一堆简单的片段相互替换为导航组件
  • ViewModel 执行业务逻辑并将一些值从一个片段传递到另一个片段
  • Activity 和 Fragment 有一个 ViewModel,不要看到有多个 ViewModel 的意义,因为它是相同的业务流程
  • 我更愿意在一个片段中存储一个值,并在下一个替换当前片段的片段中访问它,而不是将其传递到包中并在每个片段中一次又一次地手动检索

视图模型:

private var amount = 0
fun setAmount(value: Int) { amount = value}
fun getAmount() = amount

片段1:

bnd.button10.setOnClickListener { viewModel.setAmount(10) }

片段2:

if(viewModel.getAmount() < 20) { bnd.textView.text = "less than 20" }

这是一种有效的方法吗?还是有更好的?还是应该只使用 LiveData 或 Flow?

也许我应该使用SavedStateHandle?是否可以在 ViewModel 中注入?

【问题讨论】:

  • 您将值存储在视图模型中还是从磁盘/数据库/api等中检索它们?如果它都在内存中,那么我根本不会使用 LiveData,并且当您在片段之间共享 ViewModel 时,我只会使用常规变量/函数。如果某些操作需要更长的时间,我会使用挂起功能
  • btw, is it correct that the selected field isn't private? 完全取决于它的用途。
  • @Stachu,不,不再进行操作,在生命周期内存储在内存中
  • @a_local_nobody,您能否详细说明一下 MutableLiveData 字段在这种情况下不是私有的?如果 selected 无论如何都是公开的,则不要看到使用 select(item: Item) 方法的意义
  • can you please elaborate regarding that... 不,我不能,因为这是您发布的唯一代码 :) 这是我的第一条评论的重点 - 如果有 原因将其公开,然后将其公开,如果没有,则可以将其设为私有。不要过度复杂化。公开它并没有什么错误(您的代码将编译得非常好),但如果不打算使用它,您可以将其设为私有也许

标签: android viewmodel android-livedata


【解决方案1】:

回答你的问题,

,在 ViewModel 中始终使用 LiveData 不是强制性的,它只是一种可观察的模式,用于通知调用者有关数据的更新。 如果您有一些不会经常更改并且可以通过其实例访问的东西。您可以完全忽略将其包装在 LiveData 中。 无论如何,ViewModel 实例都将被保留,其中的值也是如此。

关于私有字段,MutableLiveData 不应该暴露在类之外,因为数据流总是来自 VM -> View 这是 MVVM 模式的美丽

private val selected = MutableLiveData<Item>()
val selectedLiveData : LiveData<Item>
    get() = selected

fun select(item: Item) {
    selected.value = item
}

【讨论】:

  • as the data flow is always from VM -&gt; View,但在您的代码中,sn-p 数据也通过select(item: Item) 方法从 View 流向 VM,不是吗?
  • 不是数据流,你调用的是函数,数据只是在VM内部更新。
猜你喜欢
  • 1970-01-01
  • 2013-02-23
  • 2021-05-16
  • 2018-09-05
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多