【问题标题】:Item is not updating if an attribute is changed (Jetpack Compose)如果属性发生更改,项目不会更新(Jetpack Compose)
【发布时间】:2021-09-27 09:14:00
【问题描述】:

我正在绘制设备列表

@Composable
fun DeviceListScreen(){
  val model: DeviceListViewModel = hiltViewModel()

  val myDevices: List<MyDevice> by model.myDevices.observeAsState(emptyList())
  for(device in myDevices)
    Device(device)
}

在模型中我有一个实时数据

private val items: List<MyDevice> = ArrayList()
private val _myDevices = MutableLiveData<List<MyDevice>> (emptyList())
val myDevices: LiveData<List<MyDevice>> = _myDevices

我更改项目的内容然后更新实时数据

items[0].signal = 54
_myDevices.value = items

但是数据没有在 ui 中更新。 我猜这是因为指向列表的指针没有改变,列表中的项目数也没有改变,因此 compose 不会更新这些数据。

【问题讨论】:

  • 我认为你应该使用'observeAsState'

标签: android list android-jetpack-compose


【解决方案1】:

您可以尝试将items 包装在它自己的数据类中:

data class ItemsList(val devices: List<MyDevice> = ArrayList())

然后将项目更改为private val items: ItemsList = ItemsList()

由于您使用自己的 items 数据类,然后您可以访问 copy 函数,该函数将现有对象复制到新对象中,因此应该触发 liveData 对象的更新:

_myDevices.value = _myDevices.value?.copy(items = items.devices.apply { 
    this[0].signal = 54
})

【讨论】:

  • 对整个列表调用重组。但重组并不需要特定的项目。我认为这是因为对象引用没有改变。只有属性signal 被更改,但这似乎还不够。
猜你喜欢
  • 2018-10-19
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-18
  • 1970-01-01
相关资源
最近更新 更多