数据存储偏好在Kotlin和协程中不起作用

huangapple go评论103阅读模式
英文:

Data store preferences is not working with Kotlin and Coroutines

问题

我想保存所选的数据库模式并显示当前模式。

英文:

I have a problem with data store preferences. I trying to save chosen database mode and display the current one in the settings screen, but I don't know why it's not working. I don't have any errors. I tried debugging the code, but the debugger is not going into the coroutine block.

  1. class SettingsRepository @Inject constructor(
  2. private val dataStore: DataStore<Preferences>
  3. ) {
  4. val databaseMode: Flow<String?>
  5. get() =
  6. dataStore.data.map { preferences ->
  7. preferences[DATABASE_MODE_KEY]
  8. }
  9. suspend fun updateDatabaseMode(databaseMode: String) {
  10. dataStore.edit { preferences ->
  11. preferences[DATABASE_MODE_KEY] = databaseMode
  12. }
  13. }
  14. companion object {
  15. val DATABASE_MODE_KEY = stringPreferencesKey("database_mode")
  16. }
  17. }
  1. @HiltViewModel
  2. class SettingsViewModel @Inject constructor(
  3. private val settingsRepository: SettingsRepository
  4. ) : ViewModel() {
  5. private val _settingsState = MutableStateFlow(SettingsState())
  6. var settingsState: StateFlow<SettingsState> = _settingsState.asStateFlow()
  7. init {
  8. viewModelScope.launch {
  9. settingsRepository.databaseMode.map { mode ->
  10. _settingsState.update {
  11. it.copy(
  12. databaseMode = mode ?: DatabaseMode.LOCAL.name
  13. )
  14. }
  15. }
  16. }
  17. }
  18. fun onChangeDatabaseMode(databaseMode: String) {
  19. viewModelScope.launch {
  20. settingsRepository.updateDatabaseMode(databaseMode)
  21. }
  22. _settingsState.update {
  23. it.copy(
  24. databaseMode = databaseMode,
  25. showDatabaseModeDropdown = false
  26. )
  27. }
  28. }
  29. [...]

I want to save the chosen database mode and display the current one.

答案1

得分: 0

根据您的代码,我看到databaseMode流程从未被收集,所以init块中的map从未被调用。

我建议在这种情况下使用combine来合并databaseModesettingsState流程。

可以像这样:

  1. val databaseModeFlow = settingsRepository.databaseMode
  2. val combinedFlow = settingsState.combine(databaseModeFlow) { s, d ->
  3. s.copy(databaseMode = d)
  4. }

并且应该移除init块。

英文:

As I can see in you code databaseMode flow is never collected so map in init block never called.

I would suggest using combine for databaseMode and settingsState flows in this case.

Something like this:

  1. val databaseModeFlow = settingsRepository.databaseMode
  2. val combinedFlow = settingsState.combine(databaseMode){ s, d ->
  3. s.copy(databaseMode = d)
  4. }

And init block should be removed.

huangapple
  • 本文由 发表于 2023年4月17日 16:36:37
  • 转载请务必保留本文链接:https://go.coder-hub.com/76033189.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定