Android Jetpack Compose mutableStateListOf 不进行重组

imn*_*imn 29 android kotlin android-jetpack android-jetpack-compose

所以,我有mutableStateListOf一个viewModel

var childTravellersList = mutableStateListOf<TravellersDetails>()
Run Code Online (Sandbox Code Playgroud)

TravellersDetails是一个数据类,有一个名为 的字段error

childTravellersList在 UI 中使用为:

val list = remember{viewModel.childTravellersList}

LazyColumn(state = lazyColumnState) {
    itemsIndexed(list) { index, item ->
        SomeBox(show = if(item.error) true else false)
    }
  }
Run Code Online (Sandbox Code Playgroud)

我在给定的TravellersDetailsviewModel更新中编写了一个函数:errorindexchildTravellersList

fun update(index){
    childTravellersList[index].error = true
}
Run Code Online (Sandbox Code Playgroud)

因此,每当我调用此函数时,列表都应该更新。

这会更新列表,但不会触发 UI 重组。我哪里做错了?

Phi*_*hov 49

mutableStateListOf只能通知添加/删除/替换列表中的某些元素。当您更改列表中的任何类时,可变状态无法知道它。

数据类非常适合在单向数据流中存储不可变状态,因为copy当您看到需要传递新数据以查看或可变状态时,您始终可以使用 来“更改”它。因此,避免将var变量与数据类一起使用,始终声明它们以val防止此类错误。

var childTravellersList = mutableStateListOf<TravellersDetails>()

fun update(index){
    childTravellersList[index] = childTravellersList[index].copy(error = true)
}
Run Code Online (Sandbox Code Playgroud)

另一个问题是您正在使用val list = remember{viewModel.childTravellersList}:它保存第一个列表值并防止将来更新。有了ViewModel就可以直接使用itemsIndexed(viewModel.childTravellersList)