alorma
04/22/2021, 4:59 PMstate
(i guess) to save a value in preferences, and trigger recomposition when it changes...
However, i managed to save the new value, but it is not triggering a recompostion.. what I'm missing? code on threadalorma
04/22/2021, 4:59 PM@Composable
internal fun rememberBooleanPref(key: String, defaultValue: Boolean): MutableState<Boolean> {
val context = LocalContext.current
val manager = PreferenceManager.getDefaultSharedPreferences(context)
return remember {
booleanPrefState(manager, key, defaultValue)
}
}
alorma
04/22/2021, 4:59 PMinternal fun booleanPrefState(
sharedPreferences: SharedPreferences, key: String, defaultValue: Boolean,
): MutableState<Boolean> = object : MutableState<Boolean> {
override var value: Boolean
get() = sharedPreferences.getBoolean(key, defaultValue)
set(value) {
sharedPreferences.edit { putBoolean(key, value) }
}
override fun component1(): Boolean = value
override fun component2(): (Boolean) -> Unit {
return { value = it }
}
}
Javier
04/22/2021, 5:15 PMalorma
04/22/2021, 5:16 PMRavi
04/22/2021, 6:02 PMprivate val preferenceKeyChangedFlow = MutableSharedFlow<String>(extraBufferCapacity = 1)
private val listener = SharedPreferences.OnSharedPreferenceChangeListener { _, key ->
preferenceKeyChangedFlow.tryEmit(key)
}
fun setup() { sharedPreferences.registerOnSharedPreferenceChangeListener(listener)
}
var yourData: Boolean
get() = sharedPreferences.getBoolean(YOURKEY, false)
set(value) = sharedPreferences.edit {
putBoolean(YOURKEY, value)
}
fun observeYourData(): Flow<Boolean> {
return preferenceKeyChangedFlow
// Emit on start so that we always send the initial value
.onStart { emit(YOURKEY) }
.filter { it == YOURKEY }
.map { yourData }
.distinctUntilChanged()
}
instead of writing all this like @Javier suggested use datastore which gives you flow + collectAsStatealorma
04/22/2021, 6:13 PMJavier
04/22/2021, 6:37 PMAlbert Chang
04/23/2021, 1:08 AM