Android DataStore Flow 和 LiveData |所有首选项都会收到更新,尽管只有一个首选项已更新

Android DataStore Flow and LiveData | all preferences receive update although only one preference is updated

我的应用程序中有一个架构组件 DataStore。在这个 DataStore 中,我有多个首选项。 以下是两个偏好的片段。

val calibrationFactorFlow: Flow<Float> = context.dataStore.data.map {
        preferences -> preferences[PreferencesKeys.CALIBRATION_FACTOR] ?: AppConstants.DEFAULT_CALIBRATION_FACTOR
}
suspend fun saveCalibrationToDataStore(calibrationFactor: Float) {
    context.dataStore.edit { preferences ->
        preferences[PreferencesKeys.CALIBRATION_FACTOR] = calibrationFactor
    }
}


val scaleFactorMetricFlow: Flow<Int> = context.dataStore.data.map {
        preferences -> preferences[PreferencesKeys.SCALE_FACTOR_METRIC] ?: AppConstants.DEFAULT_SCALE_FACTOR_METRIC
}
suspend fun saveScaleFactorMetricToDataStore(scaleFactor: Int) {
    context.dataStore.edit { preferences ->
        preferences[PreferencesKeys.SCALE_FACTOR_METRIC] = scaleFactor
    }
}

我在 ViewModel 中使用收到的 Flow 作为 LiveData

val calibrationFactor: LiveData<Float> = repository.calibrationFactorFlow.asLiveData()
val scaleSelectedMetricId: LiveData<Int> = repository.scaleFactorMetricFlow.asLiveData()

问题是,每当我更新数据存储中的这些首选项之一时,所有其他首选项都会收到更新。我不明白为什么,我在文档中找不到任何内容。

有人知道为什么会发生这种情况,或者当 LiveData / Flow

中只有一个偏好更新时我如何防止所有偏好接收更新

谢谢。

经过进一步研究,我在官方 Android 页面中发现了这个说法:

房间与数据存储 如果您需要部分更新、参照完整性或 large/complex 数据集,您应该考虑使用 Room 而不是 DataStore。 DataStore 是小型或简单数据集的理想选择,不支持部分更新或参照完整性。

因此 Datastore 被认为是整体式的,对于部分更新,我们必须使用另一个对象,例如 Room

编辑:

解决方法如下:在 Flow 上使用 distinctUntilChanged() 方法

    val volUpLiveData: LiveData<Int> = mContext.dataStore.data
    .map { diags ->
        diags[tagNameVolUp] ?: -1
    }.distinctUntilChanged().asLiveData()