kotlin 为什么Android Datastore总是使用运行阻塞返回相同的值

qmelpv7a  于 2023-11-21  发布在  Kotlin
关注(0)|答案(3)|浏览(350)

我已经使用Datastore很长时间了。今天我不得不读取主线程中的值。在查看文档后,我决定使用 * runblocking*。我创建了一个长值,名称为lastInsertedId。
我阅读片段A中的lastInsertedId,然后导航到片段B,我正在更改lastInsertedId的值。当我弹回片段A时,我再次读取lastInsertedId。但lastInsertedId的值仍然相同。实际上,它的值正在更改,但我无法读取它的最后一个值。
我认为这是因为片段A没有被销毁。只有onDestroyView从onDestroyView调用和创建。我想要的是我需要在主线程中随时访问lastInsertedID的当前值。
当我把它作为一个变量创建时,它总是返回相同的值。但是当我把它转换成函数时,它工作得很好。但是我不认为这是最佳实践。访问这个值的最佳方法是什么?谢谢。

  1. private val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "main")
  2. @Singleton
  3. class DataStoreManager @Inject constructor(@ApplicationContext appContext: Context) {
  4. private val mainDataStore = appContext.dataStore
  5. suspend fun setLastInsertedId(lastId: Long) {
  6. mainDataStore.edit { main ->
  7. main[LAST_INSERTED_ID] = lastId
  8. }
  9. }
  10. // Returns always the same value
  11. val lastInsertedId: Long = runBlocking {
  12. mainDataStore.data.map { preferences ->
  13. preferences[LAST_INSERTED_ID] ?: 0
  14. }.first()
  15. }
  16. // Returns as expected
  17. fun lastInsertedId(): Long = runBlocking {
  18. mainDataStore.data.map { preferences ->
  19. preferences[LAST_INSERTED_ID] ?: 0
  20. }.first()
  21. }
  22. // This is also work perfectly but i need to access in main thread.
  23. val lastInsertedId : Flow<Long> = mainDataStore.data.map { preferences ->
  24. preferences[LAST_INSERTED_ID] ?: Constants.DEFAULT_FOOD_ID
  25. }
  26. companion object {
  27. private val LAST_INSERTED_ID = longPreferencesKey("last_inserted_id")
  28. }
  29. }

字符串

xxb16uws

xxb16uws1#

必须像这样将get()添加到瓦尔定义中。

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

字符串

rsaldnfx

rsaldnfx2#

你似乎不明白变量和函数之间的关系,看看这个:

  1. fun main() {
  2. val randomNum1 = (1..10).random()
  3. repeat(5) { println(randomNum1) }
  4. repeat(5) { println(getRandomNum()) }
  5. }
  6. fun getRandomNum() = (1..10).random()

字符串
输出量:

  1. 2
  2. 2
  3. 2
  4. 2
  5. 2
  6. 8
  7. 7
  8. 8
  9. 10
  10. 1


变量保存一个值,并且在您为其分配新值之前它不会更改。

展开查看全部
m1m5dgzv

m1m5dgzv3#

lastInsertedIdDataStoreManager的一个属性,它会在调用后存储值。该值在此DataStoreManager示例中永远不会更改。
您应该向lastInsertedId添加一个getter()函数,并且永远不要使用等号让lastInsertedId存储值。
或者,你也可以添加一个函数getLastInsertedId()来获取id,像这样:

  1. suspend fun getLastInsertedId(): Long {
  2. return mainDataStore.data.map { preferences ->
  3. preferences[LAST_INSERTED_ID] ?: 0
  4. }.first()
  5. }

字符串

相关问题