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

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

我已经使用Datastore很长时间了。今天我不得不读取主线程中的值。在查看文档后,我决定使用 * runblocking*。我创建了一个长值,名称为lastInsertedId。
我阅读片段A中的lastInsertedId,然后导航到片段B,我正在更改lastInsertedId的值。当我弹回片段A时,我再次读取lastInsertedId。但lastInsertedId的值仍然相同。实际上,它的值正在更改,但我无法读取它的最后一个值。
我认为这是因为片段A没有被销毁。只有onDestroyView从onDestroyView调用和创建。我想要的是我需要在主线程中随时访问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")
    }
}

字符串

xxb16uws

xxb16uws1#

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

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

字符串

rsaldnfx

rsaldnfx2#

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

fun main() {
    val randomNum1 = (1..10).random()

    repeat(5) { println(randomNum1) }
    repeat(5) { println(getRandomNum()) }
}

fun getRandomNum() = (1..10).random()

字符串
输出量:

2
2
2
2
2
8
7
8
10
1


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

m1m5dgzv

m1m5dgzv3#

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

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

字符串

相关问题