观察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的示例。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)