我的 ViewModel 中有两个变量,它们由用户使用按钮控制。他可以通过单击适当的按钮来减少或增加值。
val age = MutableLiveData<Int>().apply { value = 0 }
val weight = MutableLiveData<Double>().apply { value = 0.0 }
现在我只想在两个变量的值都大于 0 时启用保存按钮。怎么做?我想过在 ViewModel 中创建另一个 LiveData 变量correctData
或以某种方式观察 Activity 中的年龄和体重变量,但我需要帮助,因为我不知道该怎么做。
谢谢你的帮助。
更新
我创建了 MediatorLiveData 并且它几乎可以正常工作,几乎是因为它没有检测到两个来源是否都提供了真正的价值,但是否有任何真正的价值。
private val _correctData = MediatorLiveData<Boolean>().apply {
value = false
addSource(age) { x -> x?.let { value = x > 0 } }
addSource(repeats) { x -> x?.let { value = x > 0 } }
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
你能告诉我我的做法是否正确?它有效,但我不知道它是否是正确的架构。我在某处读到,我们应该避免在负责创建片段/活动的函数上调用 viewmodel 函数,主要是因为屏幕方向的变化会调用网络请求,但我确实需要将参数从一个视图模型传递到另一个视图模型。重要的是我正在使用 Dagger Hilt 依赖注入,所以为每个视图模型创建工厂是不合理的?
假设我有项目的 RecyclerView,单击后我想启动包含详细信息的新片段 - 常见的事情。由于这些屏幕的逻辑很复杂,我决定将单个视图模型分成两个 - 一个用于列表片段,一个用于详细信息片段。
ItemsFragment
有侦听器并使用以下代码启动详细信息片段:
fun onItemSelected(item: Item) {
val args = Bundle().apply {
putInt(KEY_ITEM_ID, item.id)
}
findNavController().navigate(R.id.action_listFragment_to_detailsFragment, args)
}
Run Code Online (Sandbox Code Playgroud)
然后在函数ItemDetailsFragment
中的类中onViewCreated
,我接收传递的参数,将其保存在ItemDetailsViewModel
itemId
变量中,然后启动requestItemDetails()
函数以进行 api 调用,其结果保存到 LiveData 中,由 LiveData 观察ItemDetailsFragment
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
//...
val itemId = arguments?.getInt(KEY_ITEM_ID, -1) ?: -1
viewModel.itemId = itemId
viewModel.requestItemDetails()
//...
}
Run Code Online (Sandbox Code Playgroud)
项目详细信息视图模型
class ItemDetailsViewModel @ViewModelInject constructor(val repository: Repository) : ViewModel() {
var itemId: Int …
Run Code Online (Sandbox Code Playgroud) 我有一个带有编辑文本和 2 个按钮的简单视图,我想让用户能够使用按钮将数量增加/减少 1,或者他可以在编辑文本小部件中手动写入数量,但该值不能小于 0 且大于10. 我正在使用带有 LiveData 和数据绑定的 MVVM 架构。目前在 ViewModel 中,我有两个变量_amount: Int
和amount:MutableLiveData
. 我正在递增/递减_amount
,然后为 MutableLiveData 分配新值。它正在工作,但我想知道是否有可能仅使用一个变量来存储数量来获得相同的结果,即amount:MutableLiveData
class TestActivityVM : ViewModel() {
val amount = MutableLiveData<String>()
private var _amount = 0
init {
amount.value = _amount.toString()
}
fun increment() {
Log.d("TestActivityVM", "The amount is being increment, current value = ${amount.value}")
//increment amount value by 1 if amount is less than 10
if(_amount < 10) {
amount.value = (++_amount).toString()
}
}
fun decrement() …
Run Code Online (Sandbox Code Playgroud)