提问人:Dino Tw 提问时间:11/13/2023 更新时间:11/13/2023 访问量:30
由不同键写入触发的 Android DataStore 读取
Android DataStore read triggered by different key write
问:
通过查看文档 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_2
MY_COUNTER_1
MY_COUNTER_2
答:
1赞
BenjyTec
11/13/2023
#1
文档中关于该函数的说明:data
val data: Flow
提供对最新持久化状态的访问。
返回表示数据当前状态的流
这听起来像是每当任何值发生变化时都会发出一个新值。新发出的值将是一个对象,该对象保存存储在 中的所有当前首选项。然后,您可以按其键过滤所需的首选项,并将始终处理该值,即使该值实际上没有更改。Flow
DataStore
DataStore
collect
如果只想在特定首选项实际更改时才显示该首选项的值,请尝试使用 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
我没有看函数的文档,看完后很有意义。有关的其他信息也非常有帮助,非常感谢分享这些信息。data
distinctUntilChanged
1赞
BenjyTec
11/13/2023
别客气。我希望这能为你做工作!distinctUntilChanged()
评论