所以,我有一个 mutableStateListOf
在 viewModel
:
var childTravellersList = mutableStateListOf<TravellersDetails>()
TravellersDetails
是一个数据类,有一个名为 error
的字段.这个
childTravellersList
在 UI 中用作:val list = remember{viewModel.childTravellersList}
LazyColumn(state = lazyColumnState) {
itemsIndexed(list) { index, item ->
SomeBox(show = if(item.error) true else false)
}
}
我在 viewModel
中写了一个函数更新 error
旅行者的详细信息在给定 index
的 childTravellersList
作为:fun update(index){
childTravellersList[index].error = true
}
所以,每当我调用这个函数时,列表应该得到更新。这会更新列表,但不会触发 UI 重组 😕。
我在哪里做错了?
最佳答案
mutableStateListOf
只能通知添加/删除/替换列表中的某些元素。当您更改列表中的任何类时,可变状态无法知道它。
数据类非常适合在单向数据流中存储不可变状态,因为您始终可以使用 copy
来“更改”它。 ,而您看到需要将新数据传递给 View 或可变状态。所以避免使用var
带有数据类的变量,总是将它们声明为 val
以防止此类错误。
var childTravellersList = mutableStateListOf<TravellersDetails>()
fun update(index){
childTravellersList[index] = childTravellersList[index].copy(error = true)
}
另一个问题是您正在使用 val list = remember{viewModel.childTravellersList}
:它保存第一个列表值并防止将来更新。使用 ViewModel 可以直接使用 itemsIndexed(viewModel.childTravellersList)
关于Android Jetpack Compose mutableStateListOf 不做重组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69718059/