gpt4 book ai didi

android - 为什么 Android Datastore 总是通过运行阻塞返回相同的值

转载 作者:行者123 更新时间:2023-12-05 01:28:47 26 4
gpt4 key购买 nike

我使用 Datastore 已有很长时间了。今天我不得不阅读主线程中的值。查看文档后,我决定使用runblocking。我创建了一个名为 lastInsertedId 的长值。

我在 fragment A 中读取 lastInsertedId,然后导航到 fragment B,我正在更改 lastInsertedId 的值。当我回到 Fragment A 时,我再次阅读了 lastInsertedId。但 lastInsertedId 的值仍然相同。实际上它的值在变化,但我无法读取它的最后一个值。

我认为这是因为 fragment A 没有被破坏。只有 onDestroyView 从 onCreateView 调用和创建。我想要的是我需要在主线程中随时访问 lastInsertedID 的当前值。

当我将它创建为变量时,它总是返回相同的值。但是当我将它转换为函数时,它运行良好。但我不认为这是最佳实践。访问此值的最佳方式是什么?谢谢。

private val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "main")

@Singleton
class DataStoreManager @Inject constructor(@ApplicationContext appContext: Context) {

private val mainDataStore = appContext.dataStore

suspend fun setLastInsertedId(lastId: Long) {
mainDataStore.edit { main ->
main[LAST_INSERTED_ID] = lastId
}
}

// Returns always the same value
val lastInsertedId: Long = runBlocking {
mainDataStore.data.map { preferences ->
preferences[LAST_INSERTED_ID] ?: 0
}.first()
}

// Returns as expected
fun lastInsertedId(): Long = runBlocking {
mainDataStore.data.map { preferences ->
preferences[LAST_INSERTED_ID] ?: 0
}.first()
}

// This is also work perfectly but i need to access in main thread.
val lastInsertedId : Flow<Long> = mainDataStore.data.map { preferences ->
preferences[LAST_INSERTED_ID] ?: Constants.DEFAULT_FOOD_ID
}

companion object {
private val LAST_INSERTED_ID = longPreferencesKey("last_inserted_id")
}
}

最佳答案

您必须像这样将 get() 添加到您的 val 定义中。

val lastInsertedId: Long get() = runBlocking {
mainDataStore.data.map { preferences ->
preferences[LAST_INSERTED_ID] ?: 0
}.first()
}

关于android - 为什么 Android Datastore 总是通过运行阻塞返回相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68275999/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com