问题描述
我是否缺少某些东西,或者无法将侦听器附加到新的Android Jetpack首选项数据存储区?我认为使用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)
}
}
但是,此观察者仅发出已保存的值,而不会随着更新值而更新。退出并重新进入屏幕会显示更新的值。
这是我如何更新数据存储区中的每个值
suspend fun updateTaxLabel(newTaxLabel: String){
dataStore.edit { preferences ->
preferences[PreferencesKeys.TAX_LABEL] = newTaxLabel
}
}
我缺少什么,应该使用collect而不是map?如果是的话,有人可以向我展示如何在这种情况下使用Flow collect的示例。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)