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"
}
val Context.dataStore: DataStore<Preferences> by preferencesDataStore(
name = DataStoreConst.DATA_STORE_NAME,
produceMigrations = { context ->
listOf(
SharedPreferencesMigration(context, "settings"),
object : DataMigration<Preferences> {
override suspend fun cleanUp() {}
private val dataStoreInstance by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
preferencesDataStore(
name = DataStoreConst.DATA_STORE_NAME,
produceMigrations = { context ->
listOf(
SharedPreferencesMigration(context, "settings"),
object : DataMigration<Preferences> {
override suspend fun cleanUp() {}
override suspend fun migrate(currentData: Preferences): Preferences {
return currentData.toMutablePreferences().apply {
set(stringPreferencesKey("dark_theme"), "grey_dark")
}.toPreferences()
}
override suspend fun migrate(currentData: Preferences): Preferences {
return currentData.toMutablePreferences().apply {
set(stringPreferencesKey("dark_theme"), "grey_dark")
}.toPreferences()
}
override suspend fun shouldMigrate(currentData: Preferences): Boolean {
return currentData[stringPreferencesKey("dark_theme")] == "dark"
override suspend fun shouldMigrate(currentData: Preferences): Boolean {
return currentData[stringPreferencesKey("dark_theme")] == "dark"
}
}
}
)
}
)
)
}
)
}
val Context.dataStore: DataStore<Preferences> by dataStoreInstance
@SuppressLint("FlowOperatorInvokedInComposition")
@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)
}