android - 观察 Android Jetpack DataStore 值变化
问题描述
我是否遗漏了什么,或者无法将侦听器附加到新的 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 的示例。
解决方案
您可以直接将流作为 liveData 观察,无需将其添加为另一个实时数据的源。
您的代码将从
totalAmountLiveData.addSource(taxRateFlow.asLiveData()){ taxtRate ->
taxtRate?.let {
updateTaxAmount(it)
}
}
至
taxRateFlow.asLiveData().observe(this */ lifeCycleOwner */) {
updateTaxAmount(it)
}
在这种情况下,您可以直接看到您的数据更改数据存储并相应地执行功能。
推荐阅读
- jupyter-notebook - 有没有办法在 Jupyter Notebook 的单个单元格中混合降价和代码?或者将代码/降价导入到彼此的单元格中?
- database - 员工、部门和角色层次结构的数据库设计
- ember.js - 过渡到 Octane:替换 addObserver 设计
- javascript - 在 Google Apps 脚本中创建下拉菜单时出现错误:“sheet.indexOf 不是函数”
- python - Python getpass 函数
- python - 当 python 代码作为窗口服务运行时,用 python 编写的 Powershell 命令不执行
- r - 在 AWS 中安排 R 脚本
- windows - 如何在 Windows 中使用 .bat 进行备份?
- prestashop - Prestashop 1.7:保存和更新之间的区别?
- c - 程序打印出所有输入的变量都被拒绝,但我试图让它只在输入特定字母时打印出来,例如'u'?