android MutableStateFlow无法与MutableList一起使用

yc0p9oo0  于 2022-11-20  发布在  Android
关注(0)|答案(3)|浏览(241)

下面是我尝试使用的MutableStateFlow值:

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

我需要观察上面的MutableList上的变化(在add、removeAt等方法之后),但无法实现。我的猜测是,由于只有列表的元素发生变化,而不是列表本身发生变化,所以collect方法不会被触发。
如果可能,我如何使用StateFlow实现这一点?如果不可能,正确的方法是什么?
请注意,我需要arrayListOf()的初始值,因此LiveData可能对我来说不够。

bmvo0sr5

bmvo0sr51#

解决方法:
1.创建帮助器扩展函数:

fun <T> List<T>.mapButReplace(targetItem: T, newItem: T) = map {
    if (it == targetItem) {
        newItem
    } else {
        it
    }
}

1.对操作作出React(例如:点击事件):

val newStudent = student.copy(isSelected = !student.isSelected)

 viewModel.updateStudents(student, newStudent)

1.行程在ViewModel

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

     _students.value = newList
 }
czq61nw1

czq61nw12#

在视图模型中:

val songList: MutableStateFlow<MutableList<Song>> = MutableStateFlow(emptyList()) // modified

fun add(song: Song) {
    songList.update {
        songList.value.toMutableList().apply { this.add(song) }
    }
}

在可组合:

val songs = yourViewModel.songList.collectAsStateWithLifecycle()
cyej8jka

cyej8jka3#

为了更新***Stateflow***中的***MutableList***,您必须基于如下条件Map项,我已经完成了这一点,它的性能很好。

_userList.value = _userList.value.map {
                if (it?.userName == updatedUser.userName) updatedUser
                else it
            }

这里的**_userList是一个MutableStateFlow**@Sam Sen的解释对我的变通解决方案帮助很大。

相关问题