我想使用 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:同一个文件有多个处于活动状态的 DataStore:[...] 您应该将 DataStore 保持为单例,或者确认同一个文件上没有两个处于活动状态的 DataStore(通过确认范围是取消)。
我还尝试CoroutineScope
在注销时使用并杀死它,但是在登录时重新创建范围后,DataStore 似乎没有重新创建。
DataStore 是否支持关闭连接或处理多个文件的方法?