5

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

例 2: 複数の依存関係を持つ複雑なデータ クラス。回避策を使用してにanWorkoutRoutineを追加します。SetExerciseWorkoutRoutinecopy()toMutableList()

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()) })
    }
)

私は次のことを試しました:

  • MutableStateFlow.valueNotDistinct更新を強制する拡張値を追加しますMutableStateFlow.value
    -> 問題: MutableStateFlow.valuenullable でなければならない
var <T> MutableStateFlow<T?>.valueNotDistinct: T?
    get() = null
    set(newValue) {
        value = null
        value = newValue
    }
  • を使用MutableSharedFlowすると、同等性がチェックされません-> 問題: パフォーマンスが低く、プロパティ
    がありませんvalue

私が望むのは、発行ごとにコレクターに通知することですが、MutableStateFlow の「強制通知」機能がないように見えるため、その方法がわかりません。

4

1 に答える 1