由不同键写入触发的 Android DataStore 读取

Android DataStore read triggered by different key write

提问人:Dino Tw 提问时间:11/13/2023 更新时间:11/13/2023 访问量:30

问:

通过查看文档 DataStore,我进行了设置

build.gradle.kts

implementation ("androidx.datastore:datastore-preferences:1.0.0")

MainActivity.kt (英语)

val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "settings")
class MainActivity : ComponentActivity() {

override fun onCreate(savedInstanceState: Bundle?) {

    val MY_COUNTER_1 = intPreferencesKey("my_counter_1")
    val MY_COUNTER_2 = intPreferencesKey("my_counter_2")

    lifecycleScope.launch {
        dataStore.data
            .map { currentPreferences ->
                // Unlike Proto DataStore, there's no type safety here.
                currentPreferences[MY_COUNTER_1] ?: 0
            }.collect {
                Log.d("MainActivity", "Counter 1: $it")
            }
    }

    lifecycleScope.launch {
        dataStore.data
            .map { currentPreferences ->
                // Unlike Proto DataStore, there's no type safety here.
                currentPreferences[MY_COUNTER_2] ?: 0
            }.collect {
                Log.d("MainActivity", "Counter 2: $it")
            }
    }

    lifecycleScope.launch {
        while (true) {
            dataStore.edit { currentPreferences ->
                val currentCounterValue = currentPreferences[MY_COUNTER_2] ?: 0
                currentPreferences[MY_COUNTER_2] = currentCounterValue + 1
            }
            delay(3000)
        }
    }

我发现当用新值写入时,也会触发读取。我希望只读,我是否错误地配置了我的 DataStore?MY_COUNTER_2MY_COUNTER_1MY_COUNTER_2

Android 协程 数据存储

评论


答:

1赞 BenjyTec 11/13/2023 #1

文档中关于该函数的说明:data

val data: Flow
提供对最新持久化状态的访问。
返回表示数据当前状态的流

这听起来像是每当任何值发生变化时都会发出一个新值。新发出的值将是一个对象,该对象保存存储在 中的所有当前首选项。然后,您可以按其键过滤所需的首选项,并将始终处理该值,即使该值实际上没有更改。FlowDataStoreDataStorecollect

如果只想在特定首选项实际更改时才显示该首选项的值,请尝试使用 distinctUntilChanged 函数:collect

 dataStore.data
    .map { currentPreferences ->
        currentPreferences[MY_COUNTER_1] ?: 0
    }.distinctUntilChanged().collect {
        Log.d("MainActivity", "Counter 1: $it")
    }

评论

0赞 Dino Tw 11/13/2023
我没有看函数的文档,看完后很有意义。有关的其他信息也非常有帮助,非常感谢分享这些信息。datadistinctUntilChanged
1赞 BenjyTec 11/13/2023
别客气。我希望这能为你做工作!distinctUntilChanged()