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)
| 归档时间: |
|
| 查看次数: |
34466 次 |
| 最近记录: |