Android Jetpack撰写-观察第二次更改后不会触发实时数据

时间:2020-10-16 03:01:48

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

我正在使用viewModel将数据传递到我的撰写视图。问题是我想通过在viewModel中的模型内部处理展开和折叠视图。因此,如果某些用户界面单击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())

2 个答案:

答案 0 :(得分:0)

在观察代码中,您需要使用observeAsState,因此您的视图将与任何更改值的LiveData更新一起重组。

val items by viewModel.acquiredCoupons.observeAsState()

答案 1 :(得分:0)

问题很可能是您将原始值传递给了Composable(请您在有机会的情况下,向问题中提供示例片段)。如果认为该值等于先前的值,则不会进行重新组合。

解决这个问题的一种方法是将State对象本身传递给目标Composable

例如,如果您的设置如下:

@Composable
fun CouponBar(
    coupons: List<Coupon>
) { ... }

然后尝试

@Composable
fun CouponBar(
    coupons: State<List<Coupon>>
) { ... }