我已经使用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")
}
}
字符串
3条答案
按热度按时间xxb16uws1#
必须像这样将
get()
添加到瓦尔定义中。字符串
rsaldnfx2#
你似乎不明白变量和函数之间的关系,看看这个:
字符串
输出量:
型
变量保存一个值,并且在您为其分配新值之前它不会更改。
m1m5dgzv3#
lastInsertedId
是DataStoreManager
的一个属性,它会在调用后存储值。该值在此DataStoreManager
示例中永远不会更改。您应该向
lastInsertedId
添加一个getter()
函数,并且永远不要使用等号让lastInsertedId
存储值。或者,你也可以添加一个函数
getLastInsertedId()
来获取id,像这样:字符串