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

Sam*_*hen 7 android kotlin android-livedata kotlin-flow kotlin-stateflow

所以我正在更新我的RecylerView内容StateFlow<List>如下:

我的数据类:

data class Student(val name: String, var isSelected: Boolean)
Run Code Online (Sandbox Code Playgroud)

我的视图模型逻辑:

fun updateStudentsOnSelectionChanged(targetStudent: Student) {
    val targetIndex = _students.value.indexOf(targetStudent)
    val isSelected = !targetStudent.isSelected

    _students.value[targetIndex].isSelected = isSelected        //<- doesn't work
} 
Run Code Online (Sandbox Code Playgroud)

问题: UI没变,但isSelected内部_student变了,这是怎么回事?(和...一样LiveData

Ser*_*gey 2

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

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

val students = _students.value.toMutableList()
students[targetIndex] = students[targetIndex].copy(isSelected = isSelected)
_students.value = students
Run Code Online (Sandbox Code Playgroud)