【发布时间】: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