Noa*_*oah 10 kotlin kotlin-coroutines kotlin-flow
MutableStateFlow如果更新值等于旧值(源),则不会通知收集器。我找到了解决此问题的方法,但对于复杂值来说它不能很好地扩展。
解决方法:使用/重复数据类copy()和列表。toList()toMutableList()
WorkoutRoutine示例 1:使用解决方法重命名的简单数据类name。这里没什么问题。
data class WorkoutRoutine(
var name: String,
)
val workoutRoutine = MutableStateFlow(WorkoutRoutine("Initial"))
workoutRoutine.value.name = "Updated" // Doesn't notify collectors
workoutRoutine.value = workoutRoutine.value.copy(name = "Updated") // Workaround: works
Run Code Online (Sandbox Code Playgroud)
示例 2:WorkoutRoutine具有多个依赖项的复杂数据类,使用解决方法将 a 添加Set到Exercisein 中WorkoutRoutine:这需要大量的copy()andtoMutableList()调用,这使得代码不可读。
data class WorkoutRoutine(
var name: String,
var exercises: MutableList<Exercise> = mutableListOf(Exercise())
)
data class Exercise(
var sets: MutableList<Set> = mutableListOf(Set())
)
data class Set(
var weight: Int? = null
)
val workoutRoutine = MutableStateFlow(WorkoutRoutine("Initial"))
// Doesn't notify collectors
workoutRoutine.value.apply {
exercises = exercises.also {
it[0].sets.add(Set())
}
}
// Workaround: works
workoutRoutine.value = workoutRoutine.value.copy(
exercises = workoutRoutine.value.exercises.toMutableList().also {
it[0] = it[0].copy(sets = it[0].sets.apply { add(Set()) })
}
)
Run Code Online (Sandbox Code Playgroud)
我尝试过以下方法:
MutableStateFlow.valueNotDistinct添加强制更新的扩展值MutableStateFlow.value。MutableStateFlow.value必须可为空var <T> MutableStateFlow<T?>.valueNotDistinct: T?
get() = null
set(newValue) {
value = null
value = newValue
}
Run Code Online (Sandbox Code Playgroud)
MutableSharedFlow,不检查相等性value属性我想要的是简单地在每次发出时通知收集器,但我不知道该怎么做,因为 MutableStateFlow 似乎没有“强制通知”功能。
StateFlow 文档指出:
基于平等的强合并
状态流中的值使用 Any.equals 比较进行合并,其方式与distinctUntilChanged 运算符类似。它用于将传入的更新合并到 MutableStateFlow 中的值,并在新值等于先前发出的值时抑制向收集器发出值。未指定违反 Any.equals 约定的类的状态流行为。
解决方法可能是重写该equals方法以始终返回false。所以数据类对你的情况没有帮助。
class WorkoutRoutine() {
...
override fun equals(other: Any?): Boolean {
return false
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10490 次 |
| 最近记录: |