pref: 优化 DataStore

This commit is contained in:
HuanCheng65 2023-03-10 14:39:20 +08:00
parent a311f75327
commit 0912962f0e
No known key found for this signature in database
GPG Key ID: E9031EF91A805148
1 changed files with 26 additions and 19 deletions

View File

@ -22,31 +22,38 @@ object DataStoreConst {
const val DATA_STORE_NAME = "app_preferences" const val DATA_STORE_NAME = "app_preferences"
} }
val Context.dataStore: DataStore<Preferences> by preferencesDataStore( private val dataStoreInstance by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
name = DataStoreConst.DATA_STORE_NAME, preferencesDataStore(
produceMigrations = { context -> name = DataStoreConst.DATA_STORE_NAME,
listOf( produceMigrations = { context ->
SharedPreferencesMigration(context, "settings"), listOf(
object : DataMigration<Preferences> { SharedPreferencesMigration(context, "settings"),
override suspend fun cleanUp() {} object : DataMigration<Preferences> {
override suspend fun cleanUp() {}
override suspend fun migrate(currentData: Preferences): Preferences { override suspend fun migrate(currentData: Preferences): Preferences {
return currentData.toMutablePreferences().apply { return currentData.toMutablePreferences().apply {
set(stringPreferencesKey("dark_theme"), "grey_dark") set(stringPreferencesKey("dark_theme"), "grey_dark")
}.toPreferences() }.toPreferences()
} }
override suspend fun shouldMigrate(currentData: Preferences): Boolean { override suspend fun shouldMigrate(currentData: Preferences): Boolean {
return currentData[stringPreferencesKey("dark_theme")] == "dark" return currentData[stringPreferencesKey("dark_theme")] == "dark"
}
} }
} )
) }
} )
) }
val Context.dataStore: DataStore<Preferences> by dataStoreInstance
@SuppressLint("FlowOperatorInvokedInComposition") @SuppressLint("FlowOperatorInvokedInComposition")
@Composable @Composable
fun <T> DataStore<Preferences>.collectPreferenceAsState(key: Preferences.Key<T>, defaultValue: T): State<T> { fun <T> DataStore<Preferences>.collectPreferenceAsState(
key: Preferences.Key<T>,
defaultValue: T
): State<T> {
return data.map { it[key] ?: defaultValue }.collectAsState(initial = defaultValue) return data.map { it[key] ?: defaultValue }.collectAsState(initial = defaultValue)
} }