MutableStateFlow 不适用于 MutableList
MutableStateFlow not working with MutableList
这是我尝试使用的 MutableStateFlow 值:
val songList: MutableStateFlow<MutableList<Song>> = MutableStateFlow(arrayListOf())
我需要在上面的 MutableList 上观察变化(在 add、removeAt 等方法之后),但无法实现。我的猜测是因为只有列表的元素而不是列表本身发生变化,所以不会触发 collect 方法。
如果可能,如何使用 StateFlow 实现?如果不是,正确的做法是什么?
请注意,我需要 arrayListOf() 的初始值,因此 LiveData 可能对我来说不够。
有益阅读:
Notify LiveData observers when nested properties change
问题是什么:
如果嵌套字段发生更改,StateFlow 和 LiveData 将不会收到通知。
示例 1:更新列表的特定项目(不是 add/remove)。
示例 2:更新对象的特定 属性。
解决方案:
创建辅助扩展函数:
fun <T> List<T>.mapButReplace(targetItem: T, newItem: T) = map {
if (it == targetItem) {
newItem
} else {
it
}
}
对动作的反应(例如:点击事件):
val newStudent = student.copy(isSelected = !student.isSelected)
viewModel.updateStudents(student, newStudent)
句柄在ViewModel
:
fun updateStudents(currentStudent: Student, newStudent: Student) {
val newList = _students.value.mapButReplace(currentStudent, newStudent)
_students.value = newList
}
这是我尝试使用的 MutableStateFlow 值:
val songList: MutableStateFlow<MutableList<Song>> = MutableStateFlow(arrayListOf())
我需要在上面的 MutableList 上观察变化(在 add、removeAt 等方法之后),但无法实现。我的猜测是因为只有列表的元素而不是列表本身发生变化,所以不会触发 collect 方法。
如果可能,如何使用 StateFlow 实现?如果不是,正确的做法是什么?
请注意,我需要 arrayListOf() 的初始值,因此 LiveData 可能对我来说不够。
有益阅读: Notify LiveData observers when nested properties change
问题是什么:
如果嵌套字段发生更改,StateFlow 和 LiveData 将不会收到通知。
示例 1:更新列表的特定项目(不是 add/remove)。
示例 2:更新对象的特定 属性。
解决方案:
创建辅助扩展函数:
fun <T> List<T>.mapButReplace(targetItem: T, newItem: T) = map { if (it == targetItem) { newItem } else { it } }
对动作的反应(例如:点击事件):
val newStudent = student.copy(isSelected = !student.isSelected) viewModel.updateStudents(student, newStudent)
句柄在
ViewModel
:fun updateStudents(currentStudent: Student, newStudent: Student) { val newList = _students.value.mapButReplace(currentStudent, newStudent) _students.value = newList }