如何解决观察Android Jetpack数据存储的价值变化
我是否缺少某些东西,或者无法将侦听器附加到新的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的示例。
解决方法
您可以直接将流作为实时数据进行观察,无需将其添加为其他实时数据的源。
您的代码将从
totalAmountLiveData.addSource(taxRateFlow.asLiveData()){ taxtRate ->
taxtRate?.let {
updateTaxAmount(it)
}
}
到
taxRateFlow.asLiveData().observe(this */ lifeCycleOwner */) {
updateTaxAmount(it)
}
在这种情况下,您可以直接看到更改数据存储的数据并相应地执行功能。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。