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

标签 android kotlin android-jetpack android-jetpack-compose

我正在使用 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/

相关文章:

kotlin - 如何在kotlin中将列表分解为 map ?

android - 如何在 Jetpack Compose 中制作可重用的组件?

java - Android - 调整图标 map 大小

java - 我需要录制音频来调用 getMaxAmplitude() 吗?

android - 带有 CursorLoader 和 SimpleCursorAdapter 的 ListView 不显示数据

kotlin - 如何在 kDoc 中表示超链接

android - 如何在Kotlin中使用find扩展功能并将其索引存储在lambda中

Android Jetpack导航,另一个主机 fragment 内的主机 fragment

android - Android 中哪一种更好的设计方法 - 多个 Activity/Fragments

android - 如何为 Android 编译 OpenSSL 1.1.1