首页 > 解决方案 > Android Jetpack Compose mutableStateListOf 不做重组

问题描述

所以,我有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)
    }
  }

我在TravellersDetails 的viewModel更新中编写了一个函数,如下所示:errorindexchildTravellersList

fun update(index){
    childTravellersList[index].error = true
}

所以,每当我调用这个函数时,列表应该得到更新。

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

标签: androidkotlinandroid-jetpack-composeandroid-jetpack

解决方案


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

数据类非常适合在单向数据流中存储不可变状态,因为您始终可以使用 来“更改”它copy,同时您看到需要将新数据传递给视图或可变状态。所以避免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)


推荐阅读