gpt4 book ai didi

Android Jetpack Compose mutableStateListOf 不做重组

转载 作者:行者123 更新时间:2023-12-04 23:41:24 61 4
gpt4 key购买 nike

所以,我有一个 mutableStateListOfviewModel :

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旅行者的详细信息在给定 indexchildTravellersList作为:
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/

61 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com