Android LiveData/StateFlow 列表项属性更新问题

标签 android kotlin android-livedata kotlin-flow kotlin-stateflow

所以我正在更新我的RecylerViewStateFlow<List>如下所示:
我的数据类:

data class Student(val name: String, var isSelected: Boolean)
我的 ViewModel 逻辑:
fun updateStudentsOnSelectionChanged(targetStudent: Student) {
    val targetIndex = _students.value.indexOf(targetStudent)
    val isSelected = !targetStudent.isSelected

    _students.value[targetIndex].isSelected = isSelected        //<- doesn't work
} 
问题: UI 没有改变,但 isSelected里面 _student变了,怎么回事? (与 LiveData 相同)

最佳答案

我假设 _studentsStateFlow<List> .更改 isSelected Student 的属性(property)模型不会触发 StateFlow .解决方法是使 isSelected Student 的属性(property)数据类不可变以在设置新状态时对其进行比较,创建 MutableList退出当前列表并复制现有的Student具有 isSelected 新值的对象属性(property):

data class Student(val name: String, val isSelected: Boolean)

val students = _students.value.toMutableList()
students[targetIndex] = students[targetIndex].copy(isSelected = isSelected)
_students.value = students

关于Android LiveData/StateFlow 列表项属性更新问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71187022/

相关文章:

android - 分页库 - 网络 + db 的边界回调,API 获取页面和大小

Android MediaController 位置

android - LiveData 是热的还是冷的?

android - 解析 Activity 未显示

php - 无法使用Fuel Kotlin将POST请求发送到我的PHP页面

kotlin - `Unit = Unit`在 Kotlin (Kotlin)中的作用是什么?

android - 使用Espresso在UI测试选项菜单中无法使用withId方法选择 View /菜单项

java.lang.IllegalArgumentException : This source was already added with the different observer 异常

android - 如何使 MaterialAlertDialogBu​​ilder 中的 ClickableSpan 链接可点击?

Android:检测 SD 卡何时作为磁盘驱动器安装到计算机