gpt4 book ai didi

android - 如何将 Android DataStore 与多用户或文件一起使用

转载 作者:行者123 更新时间:2023-12-04 23:37:35 25 4
gpt4 key购买 nike

我想使用 DataStore 存储一些首选项。但问题是我的应用程序可以有多个用户,因此需要将这些首选项存储在单独的文件中。我得到了一个仅使用一个用户的工作示例,但我正在努力支持多个用户。
这是我的代码示例:

class DataStorageRepository(private val context: Context, private val userRepository: UserRepository) {

private object PreferencesKeys {
val SETTING_ONE = intPreferencesKey("setting_one")
}

// retrieve datastore for currently logged in user.
private val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = userRepository.currentRegistration().name)

val userPreferencesFlow: Flow<UserPreferences> = context.dataStore.data.map { preferences ->
val settingOne = preferences[PreferencesKeys.SETTING_ONE] ?: 0

UserPreferences(settingOne)
}

suspend fun storeSettingOne(settingOne: Int) {
context.dataStore.edit { preferences ->
preferences[PreferencesKeys.SETTING_ONE] = settingOne
}
}

data class UserPreferences(val lastUsedToAccountTab: Int)
}
我正在使用 Koin我尝试卸载 DataStorageRepository注销并在登录时重新创建它,但 DataStore 似乎一直存在,直到应用程序被杀死并且我得到以下崩溃:

java.lang.IllegalStateException: There are multiple DataStores activefor the same file: [...] You should either maintain your DataStore asa singleton or confirm that there is no two DataStore's active on thesame file (by confirming that the scope is cancelled).


我也尝试使用 CoroutineScope并在我注销时将其杀死,但是在登录时重新创建范围后,似乎没有重新创建 DataStore。
DataStore 是否支持关闭连接或处理多个文件的方法?

最佳答案

将此行放入伴随对象 { }

private val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "settingPrefs")
我的代码
class SettingPrefs(private val context: Context) {

companion object {
private val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "settingPrefs")
private val soundKey = booleanPreferencesKey("sound")
private val vibrateKey = booleanPreferencesKey("vibrate")
}

val getSound: Flow<Boolean>
get() = context.dataStore.data.map {
it[soundKey] ?: true
}

suspend fun setSound(value: Boolean) {
context.dataStore.edit { it[soundKey] = value }
}

val getVibration: Flow<Boolean>
get() = context.dataStore.data.map {
it[vibrateKey] ?: true
}

suspend fun setVibration(value: Boolean) {
context.dataStore.edit { it[vibrateKey] = value }
}
}

关于android - 如何将 Android DataStore 与多用户或文件一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66669724/

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