Suhaib Kazi
06/06/2024, 8:52 AMinterface DataStorePreference<K : PreferenceKeys<*>> {
fun <T> getPreference(key: PreferenceKeys<T>, defaultValue: T): Flow<T>
suspend fun <T> putPreference(key: PreferenceKeys<T>, value: T)
suspend fun <T> removePreference(key: PreferenceKeys<T>)
suspend fun clearAllPreference()
}
sealed class PreferenceKeys<T>(val key: Preferences.Key<T>) {
sealed class UserKeys<T>(key: Preferences.Key<T>) : PreferenceKeys<T>(key) {
data object IntroScreenShown : UserKeys<Boolean>(booleanPreferencesKey("intro_screen_shown"))
data object IsLoggedIn : UserKeys<Boolean>(booleanPreferencesKey("is_logged_in"))
}
sealed class DataKeys<T>(key: Preferences.Key<T>) : PreferenceKeys<T>(key) {
data object AccessToken : DataKeys<String>(stringPreferencesKey("access_token"))
data object ClientID : DataKeys<String>(stringPreferencesKey("client_id"))
}
}
I have this implementation to help me create different objects of different types of datastore prefs
i basically wanted to enforce type safety between different types of preferences i might have
Here i have 2 i.e User and Data
Now i dont want to allow userkeys in data prefs file
What am i doing wrong?Suhaib Kazi
06/06/2024, 9:08 AMclass DataStorePreferenceImpl<K : PreferenceKeys<*>> @Inject constructor(
private val preferencesDataStore: DataStore<Preferences>
) : DataStorePreference<K> {
override fun <T> getPreference(key: PreferenceKeys<T>, defaultValue: T): Flow<T> =
preferencesDataStore.data.catch { exception ->
if (exception is IOException) {
emit(emptyPreferences())
} else {
throw exception
}
}.map { preferences ->
preferences[key.key] ?: defaultValue
}
override suspend fun <T> putPreference(key: PreferenceKeys<T>, value: T) {
preferencesDataStore.edit { preferences ->
preferences[key.key] = value
}
}
override suspend fun <T> removePreference(key: PreferenceKeys<T>) {
preferencesDataStore.edit {
it.remove(key.key)
}
}
override suspend fun clearAllPreferences() {
preferencesDataStore.edit { preferences ->
preferences.clear()
}
}
}
Suhaib Kazi
06/06/2024, 9:11 AM