我正在使用viewModel将数据传递给我的合成视图。问题是,我想在viewModel中的模型中通过文件来处理展开和折叠视图。所以如果一些UI点击expand方法,我会像这样调用viewModel和doExpand方法:
private val _acquiredCoupons = MutableLiveData<List<AcquiredCoupon>>(listOf())
val acquiredCoupons: LiveData<List<AcquiredCoupon>> = _acquiredCoupons
fun doExpand(coupon : AcquiredCoupon){
val index = _acquiredCoupons.value?.indexOf(coupon) ?: -1
val newItems = _acquiredCoupons.value?.toMutableList().also {
it?.get(index)?.isExpanded = true
}
_acquiredCoupons.value = newItems
Timber.i("Mahdi $index")
}
字符串
但事情是更新后的模型在撰写UI将不会触发和重新撰写是不会发生!我是这样观察实时数据的:
val items = viewModel.acquiredCoupons.observeAsState(initial = emptyList())
型
4条答案
按热度按时间bqf10yzr1#
如果任何人在观察列表时仍然有这个问题,我发现一个很好的解决方案是在ViewModel/LiveData中从
List
切换到SnapshotStateList。转换后:
字符串
对于此表单:
型
当项目添加到列表中时,我的Composable按预期工作
型
rlcwz9us2#
在您的观察代码中,您需要使用
observeAsState
,因此您的视图将使用任何更改值的LiveData更新进行重组。val items by viewModel.acquiredCoupons.observeAsState()
个rlcwz9us3#
问题很可能是您正在将原始值传递给
Composable
(请在有机会时包含一个示例片段到您的问题中)。如果认为该值等于前一值,则不会发生重组。解决这个问题的一种方法是将
State
对象本身传递给目标Composable
。例如,如果你这样设置:
字符串
那就试试
型
vlf7wbxs4#
您的liveData中使用的是list,而不是MutableList,因此会出现此问题。