我是否遗漏了什么,或者无法将侦听器附加到新的 Android Jetpack Preference Datastore?我认为使用 Flow 的全部意义在于我们可以在 Preference Datastore 上调用 flow.toLiveData() 并观察值变化的变化。
这是我从数据存储区获取流的方式。
val taxRatePreferenceFlow: Flow<TaxRate> = dataStore.data
.catch { exception ->
if (exception is IOException){
emit(emptyPreferences())
} else {
throw exception
}
}.map { preferences ->
val name = preferences[PreferencesKeys.TAX_LABEL] ?: "Tax"
val rate = preferences[PreferencesKeys.TAX_RATE] ?: Constants.DEFAULT_TAX_RATE.toFloat()
val type = TaxType.valueOf(preferences[PreferencesKeys.TAX_TYPE] ?: TaxType.ON_ITEMS.name)
TaxRate(name, rate, type)
}
我希望在 ViewModel 中将 Flow 转换为 LiveData 并监听更改,直到删除观察者。
totalAmountLiveData.addSource(taxRateFlow.asLiveData()){ taxtRate ->
taxtRate?.let {
updateTaxAmount(it)
}
}
但是,此观察者仅发出保存的值,并且不会随着值的更新而更新。退出并重新进入屏幕会显示更新后的值。
这是我如何更新 DataStore 中的每个值
suspend fun updateTaxLabel(newTaxLabel: String){
dataStore.edit { preferences ->
preferences[PreferencesKeys.TAX_LABEL] = newTaxLabel
}
}
我错过了什么,我应该使用收集而不是地图吗?如果是,有人可以向我展示如何在这种情况下使用 Flow collect 的示例。