Compose + DataStore:数据持久化最佳实践

2024-06-07 · 22 min · 持久化

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")
        )
    }
)

五、最佳实践

总结