2

我知道在 Jetpack Compose 中,您必须更改传入数据的状态才能触发 UI 的重新组合,以使用任何更改来更新 UI。我还在这里阅读了有关 Jetpack Compose 状态和 ViewModels 的文档。但这是一个非常简单的示例,并没有涵盖下面的用例。

下面是一个概念场景,我想通过仅更新一个项目的状态来更新列表的状态,该状态我希望反映在 Jetpack Compose 渲染部分中。我知道我必须分配一个新列表作为数据,这应该会触发重组,下面我正在使用toMutableList()它来尝试实现这一点。但这不起作用。当我运行这种代码时,不会发生重组,并且列表中不会更新单个项目的状态。

有人可以向我解释为什么这不起作用以及我应该如何解决这个问题?

我已经知道了mutableStateListOf(),但是如果我想让我的视图模型与我的应用程序的其他非 Jetpack Compose 部分兼容,我应该如何处理这个问题,因此我只想在我的视图模型中使用 LiveData?

class Model : ViewModel() {
  private val _items = MutableLiveData(listOf<Something>())
  val items: LiveData<String> = _items

  fun update(item: Something) {
    _items.value = _items.value!!.toMutableList().map {
        if (it == item) {
           // Update item. But it's not reflected in Jetpack Compose
        }
     }
  }
}

@Composable
fun ListComponent(model: Model) {
   val items by model.items.observeAsState(emptyList())
   LazyColumn {
      items(items) { item -> 
       ...
      }
   }
}
4

1 回答 1

0

我认为这是因为您正在改变数组而不是复制它。Compose 在谈到避免重组时需要稳定的平等,这里我相信它只能使用参考。尝试复制数组,然后改变新数组。我相信,如果您在没有toMutableList()它的情况下进行映射,则会创建一个副本并完全按照您的意愿行事

于 2021-09-27T06:06:05.220 回答