DataStore Preferences在Kotlin协程中无法保存与显示数据库模式的问题
DataStore Preferences 无法保存/读取数据库模式的问题解决
核心问题1:Flow 未执行终端操作
ViewModel 初始化块中,对settingsRepository.databaseMode仅调用了map操作符,但没有执行**collect(收集)**这个终端操作。Flow 是冷流,只有触发终端操作时,上游数据流才会开始发射数据,对应的代码块才会执行——这就是调试时无法进入协程代码块的根本原因。
修复后的初始化代码:
init { viewModelScope.launch { settingsRepository.databaseMode.collect { mode -> _settingsState.update { it.copy( databaseMode = mode ?: DatabaseMode.LOCAL.name ) } } } }
问题2:Lambda 箭头语法错误
代码中多处将 Lambda 的标准箭头符号->误写为-,这会导致 Lambda 无法被正确解析,直接影响 Flow 的正常工作(即便你说代码无报错,大概率是粘贴时的格式问题导致的显示错误)。
修复 Repository 中的代码:
class SettingsRepository @Inject constructor( private val dataStore: DataStore<Preferences> ) { val databaseMode: Flow<String?> get() = dataStore.data.map { preferences -> preferences[DATABASE_MODE_KEY] } suspend fun updateDatabaseMode(databaseMode: String) { dataStore.edit { preferences -> preferences[DATABASE_MODE_KEY] = databaseMode } } companion object { val DATABASE_MODE_KEY = stringPreferencesKey("database_mode") } }
额外优化:保证状态一致性
在onChangeDatabaseMode方法中,当前异步更新 DataStore 后立即同步修改 StateFlow,虽然能即时显示状态,但依赖 DataStore 的 Flow 自动同步状态会更可靠——因为我们已经在初始化时收集了 DataStore 的 Flow,当 DataStore 数据更新时,StateFlow 会自动被更新。可以简化方法:
fun onChangeDatabaseMode(databaseMode: String) { viewModelScope.launch { settingsRepository.updateDatabaseMode(databaseMode) _settingsState.update { it.copy(showDatabaseModeDropdown = false) } } }
内容的提问来源于stack exchange,提问作者Mateusz Hermanowicz
相关产品推荐
相关产品推荐

