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:更新对象的特定 属性。


解决方案:

  1. 创建辅助扩展函数:

    fun <T> List<T>.mapButReplace(targetItem: T, newItem: T) = map {
        if (it == targetItem) {
            newItem
        } else {
            it
        }
    }
    
  2. 对动作的反应(例如:点击事件):

     val newStudent = student.copy(isSelected = !student.isSelected)
    
     viewModel.updateStudents(student, newStudent)
    
  3. 句柄在ViewModel:

     fun updateStudents(currentStudent: Student, newStudent: Student) {
         val newList = _students.value.mapButReplace(currentStudent, newStudent)
    
         _students.value = newList
     }