下面是我尝试使用的MutableStateFlow值:
val songList: MutableStateFlow<MutableList<Song>> = MutableStateFlow(arrayListOf())我需要观察更改(在添加、removeAt等方法之后)在我上面的MutableList上,但无法实现。我的猜测是,由于只有列表的元素更改而不是列表本身,收集方法不会被触发。
如果可能的话,我如何使用StateFlow实现这一点?如果没有,正确的方法是什么?
注意,我需要arrayListOf()的初始值,所以LiveData对我来说可能不够。
发布于 2022-01-29 18:40:22
Notify LiveData observers when nested properties change
- StateFlow and LiveData won't get notified if the nested field gets changed.- Ex 1: Update specific item of a List (not add/remove).- Ex 2: Update specifc property of an object.解决方案:
List.mapButReplace(targetItem: T,newItem: T) = map { if (it == targetItem) { newItem }== }
val newStudent = student.copy(isSelected = !student.isSelected) viewModel.updateStudents(学生,newStudent)
ViewModel):乐趣updateStudents(currentStudent:学生,newStudent:学生){ val newList = _students.value.mapButReplace(currentStudent,newStudent) _students.value = newList }
发布于 2022-11-18 16:47:01
在您看来,模型:
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()发布于 2022-09-13 16:54:47
为了更新MutableList在Stateflow中,您必须根据下面这样的条件映射项目,这是我已经完成的,并且执行得很好。
_userList.value = _userList.value.map {
if (it?.userName == updatedUser.userName) updatedUser
else it
}这里,MutableStateFlow @Sam的解释_userList对我的解决方案有很大帮助。
https://stackoverflow.com/questions/70905480
复制相似问题