Android Jetpack Compose mutableStateListOf 不做重组

标签 android kotlin android-jetpack-compose android-jetpack

所以,我有一个 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/

相关文章:

android - 无法启动 Activity ComponentInfo {className} java.lang.IllegalStateException:找不到颜色! (Android JetPack撰写)

android - Jetpack Compose 如何创建具有特定大小和配置的 ImageBitmap?

android - 如何在 eclipse 中调试 Proguard 混淆的 apk 文件

java - 如何根据类别实现带有节标题的 RecyclerView?

android - 使用动态数组和对象处理 gson

Kotlin 协程 : concurrent execution throttling

android - 如何基于Android中该 View 的坐标来知道一个 View 何时在另一 View 之上

针对 glibc 的 Android 静态链接与动态链接

android - Google 论坛短网址在 Android 应用程序 Webview 中不起作用

android - Compose LazyColumn 键,对项目进行排序时滚动会变得困惑