微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

观察Android Jetpack数据存储的价值变化

如何解决观察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 举报,一经查实,本站将立刻删除。