android - 观察 Android Jetpack DataStore 值变化

标签 android kotlin-coroutines 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
        }
    }
我错过了什么,我应该使用收集而不是 map 吗?如果是,有人可以向我展示如何在这种情况下使用 Flow collect 的示例。

最佳答案

您可以直接将流作为 liveData 观察,无需将其添加为另一个实时数据的源。
您的代码将从

totalAmountLiveData.addSource(taxRateFlow.asLiveData()){ taxtRate ->
        taxtRate?.let {
            updateTaxAmount(it)
        }
    }
taxRateFlow.asLiveData().observe(this */ lifeCycleOwner */) {
            updateTaxAmount(it)
}
在这种情况下,您可以直接看到您的数据更改数据存储并相应地执行功能。

关于android - 观察 Android Jetpack DataStore 值变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64311741/

相关文章:

android - 通过热点获取连接设备的名称

Androidx 首选项库与数据存储首选项

android - 添加涟漪效应和线分隔符

java - android 读/写用户首选项

android - 如何让 Ratchet 与 android sdk apis 通信

Kotlin 从 generateSequence() 到 flow() ,但生成了错误的字节码

android - 即使添加 androidx.room:room-ktx 后,房间错误 : Type of the parameter must be a class annotated with @Entity or a collection/array of it.

android - 一旦 API 失败,Coroutine 永远不会调用 API

android - 在更新之前使用 Flow 从 DataStore 中读取值

android - 如何使用 Dagger-Hilt 注入(inject) Kotlin 扩展属性