我知道在 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 ->
...
}
}
}