android - 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
更新中编写了一个函数,如下所示:error
index
childTravellersList
fun update(index){
childTravellersList[index].error = true
}
所以,每当我调用这个函数时,列表应该得到更新。
这会更新列表,但不会触发 UI 重组。我在哪里做错了?
解决方案
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)
推荐阅读
- numpy - 如何将图像 jpg 与 numpy.load() 一起使用
- python - 找出列表中的任何单词是否是较长单词中的子字符串的更快方法
- reactjs - Mapbox:将控制器添加到 Deck.gl 组件
- excel - 对象 '_Worksheet' 的方法 'Range' 使用 Range("Reference!D3") 失败
- javascript - 如果单击数组中的一个元素,则将一个类添加到相同的第 n 个其他数组
- python - 抓取 html 页面时如何找出正确的 div、类、跨度
- microservices - Redhat Fuse 和 PAM 用例
- docker - docker-compose 用目录挂载单个文件
- python - 如何从 Keras 获取词嵌入?
- google-apps-script - 根据标题将 Google Doc 文本复制到 Google 工作表中