0

这是我尝试使用的 MutableStateFlow 值:

val songList: MutableStateFlow<MutableList<Song>> = MutableStateFlow(arrayListOf())

我需要在上面的 MutableList 上观察更改(在 add、removeAt 等方法之后),但无法实现。我的猜测是因为只有列表的元素而不是列表本身发生了变化,所以收集方法不会被触发。

如果可能的话,我怎样才能使用 StateFlow 来实现呢?如果没有,正确的方法是什么?

请注意,我需要 arrayListOf() 的初始值,所以 LiveData 对我来说可能还不够。

4

1 回答 1

0
  • 有用的阅读: 当嵌套属性发生变化时通知 LiveData 观察者

  • 问题是什么:

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

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

    • 例 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
     }
    
于 2022-01-29T18:40:22.930 回答