是否应该始终在 ViewModel 中使用 livedata?

exe*_*nza 2 android viewmodel android-livedata

视图模型中字段的推荐模式似乎是:

val selected = MutableLiveData<Item>()

fun select(item: Item) {
    selected.value = item
}
Run Code Online (Sandbox Code Playgroud)

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

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

我的项目详细信息:

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

视图模型:

private var amount = 0
fun setAmount(value: Int) { amount = value}
fun getAmount() = amount
Run Code Online (Sandbox Code Playgroud)

片段1:

bnd.button10.setOnClickListener { viewModel.setAmount(10) }
Run Code Online (Sandbox Code Playgroud)

片段2:

if(viewModel.getAmount() < 20) { bnd.textView.text = "less than 20" }
Run Code Online (Sandbox Code Playgroud)

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

也许我应该使用SavedStateHandle?它可以注入到 ViewModel 中吗?

raj*_* ks 5

为了回答你的问题,

,并不强制在 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
}
Run Code Online (Sandbox Code Playgroud)