MutableStateFlow 不适用于 MutableList

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 对我来说可能不够。

Sam*_*hen 1

  • 有用的阅读: 当嵌套属性更改时通知 LiveData 观察者

  • 问题是什么:

    • 如果嵌套字段发生更改,StateFlow 和 LiveData 将不会收到通知。

    • 示例 1:更新列表的特定项目(不是添加/删除)。

    • 例 2:更新对象的特定属性。


解决方案:

  1. 创建辅助扩展函数:

    fun <T> List<T>.mapButReplace(targetItem: T, newItem: T) = map {
        if (it == targetItem) {
            newItem
        } else {
            it
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 对操作做出反应(例如:单击事件):

     val newStudent = student.copy(isSelected = !student.isSelected)
    
     viewModel.updateStudents(student, newStudent)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 处理于ViewModel

     fun updateStudents(currentStudent: Student, newStudent: Student) {
         val newList = _students.value.mapButReplace(currentStudent, newStudent)
    
         _students.value = newList
     }
    
    Run Code Online (Sandbox Code Playgroud)