DataStore 是 Android 官方推荐的数据持久化方案,用于替代 SharedPreferences。它提供异步、一致性的 API,并与 Kotlin 协程和 Flow 无缝集成。
一、Preferences DataStore
// 创建 DataStore
val Context.settingsDataStore: DataStore<Preferences> by preferencesDataStore(
name = "settings"
)
// 定义键
object PreferencesKeys {
val THEME_MODE = stringPreferencesKey("theme_mode")
val NOTIFICATIONS_ENABLED = booleanPreferencesKey("notifications_enabled")
}
二、读写数据
class SettingsRepository(private val dataStore: DataStore<Preferences>) {
// 读取(返回 Flow)
val themeMode: Flow<String> = dataStore.data
.map { preferences ->
preferences[PreferencesKeys.THEME_MODE] ?: "system"
}
// 写入
suspend fun setThemeMode(mode: String) {
dataStore.edit { preferences ->
preferences[PreferencesKeys.THEME_MODE] = mode
}
}
}
三、在 Compose 中使用
@Composable
fun SettingsScreen(viewModel: SettingsViewModel = hiltViewModel()) {
val themeMode by viewModel.themeMode.collectAsState()
ThemeModeSelector(
currentMode = themeMode,
onModeSelected = { viewModel.setThemeMode(it) }
)
}
四、从 SharedPreferences 迁移
val Context.dataStore: DataStore<Preferences> by preferencesDataStore(
name = "settings",
produceMigrations = { context ->
listOf(
SharedPreferencesMigration(context, "old_settings")
)
}
)
五、最佳实践
- ✅ 在顶层声明 DataStore(避免多实例)
- ✅ 使用 Flow 观察数据变化
- ✅ 处理 IOException 异常
- ✅ Proto DataStore 用于复杂类型
- ✅ 使用迁移从 SharedPreferences 升级
总结
- Preferences DataStore:简单键值对
- Proto DataStore:类型安全复杂对象
- Flow:响应式数据观察
- Migration:平滑迁移