作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用 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。
最佳答案
将此行放入伴随对象 { }
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/
我是一名优秀的程序员,十分优秀!