首页 > 解决方案 > 观察 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 的示例。

标签: androidkotlin-coroutinesandroid-jetpack-datastore

解决方案


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

您的代码将从

totalAmountLiveData.addSource(taxRateFlow.asLiveData()){ taxtRate ->
        taxtRate?.let {
            updateTaxAmount(it)
        }
    }

taxRateFlow.asLiveData().observe(this */ lifeCycleOwner */) {
            updateTaxAmount(it)
}

在这种情况下,您可以直接看到您的数据更改数据存储并相应地执行功能。


推荐阅读