gpt4 book ai didi

Android Jetpack compose - 观察第二次更改后未触发的实时数据

转载 作者:行者123 更新时间:2023-12-03 20:48:21 26 4
gpt4 key购买 nike

我正在使用 viewModel 将数据传递给我的撰写 View 。问题是我想通过在 viewModel 中的模型中归档来处理展开和折叠 View 。因此,如果某些 UI 单击扩展方法,我将调用 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())

最佳答案

如果有人在查看列表时仍然遇到此问题,我发现一个很好的解决方案是从 List 切换至SnapshotStateList在 ViewModel/LiveData 中。
从此转换后:

class MainViewModel : ViewModel() {
val itemLiveData: LiveData<List<String>>
get() = items

private val items = MutableLiveData<List<String>>()
private val itemImpl = mutableListOf<String>()

fun addItem(name: String){
itemImpl.add(name)
items.postValue(itemImpl)
}
}
到这个表格:
class MainViewModel : ViewModel() {
val itemLiveData: LiveData<SnapshotStateList<String>>
get() = items

private val items = MutableLiveData<SnapshotStateList<String>>()
private val itemImpl = mutableStateListOf<String>()

fun addItem(name: String){
itemImpl.add(name)
items.postValue(itemImpl)
}
}
将项目添加到列表时,我的可组合项按预期工作
@Composable
fun ItemList(model: MainViewModel = viewModel()) {
Column {
Button(
onClick = { model.addItem("New item") },
content = { Text(text="Add item") }
)

val items by model.itemLiveData.observeAsState()

if( items.isNullOrEmpty() ) {
Text(text = "No items")
}
else {
items?.forEach { item ->
Text(text=item)
}
}
}
}

关于Android Jetpack compose - 观察第二次更改后未触发的实时数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64382335/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com