bug*_*gra 6 android reactive-programming android-livedata kotlin-stateflow
这是我尝试使用的 MutableStateFlow 值:
val songList: MutableStateFlow<MutableList<Song>> = MutableStateFlow(arrayListOf())
Run Code Online (Sandbox Code Playgroud)
我需要观察上面 MutableList 上的更改(在 add、removeAt 等方法之后),但无法实现这一点。我的猜测是,因为只有列表的元素发生变化,而不是列表本身发生变化,所以不会触发收集方法。
如果可能的话,如何使用 StateFlow 实现这一目标?如果不是,正确的做法是什么?
请注意,我需要 arrayListOf() 的初始值,因此 LiveData 对我来说可能不够。
有用的阅读: 当嵌套属性更改时通知 LiveData 观察者
问题是什么:
如果嵌套字段发生更改,StateFlow 和 LiveData 将不会收到通知。
示例 1:更新列表的特定项目(不是添加/删除)。
例 2:更新对象的特定属性。
解决方案:
创建辅助扩展函数:
fun <T> List<T>.mapButReplace(targetItem: T, newItem: T) = map {
if (it == targetItem) {
newItem
} else {
it
}
}
Run Code Online (Sandbox Code Playgroud)
对操作做出反应(例如:单击事件):
val newStudent = student.copy(isSelected = !student.isSelected)
viewModel.updateStudents(student, newStudent)
Run Code Online (Sandbox Code Playgroud)
处理于ViewModel:
fun updateStudents(currentStudent: Student, newStudent: Student) {
val newList = _students.value.mapButReplace(currentStudent, newStudent)
_students.value = newList
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4162 次 |
| 最近记录: |