Skip to content

Instantly share code, notes, and snippets.

@yongjhih
Last active November 3, 2023 03:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yongjhih/c4650178751a6bd28a60b24e6d41575d to your computer and use it in GitHub Desktop.
Save yongjhih/c4650178751a6bd28a60b24e6d41575d to your computer and use it in GitHub Desktop.
class MyViewModel(private val sharedPreferences: SharedPreferences) : ViewModel {
var isAdult by sharedPreferences.isAdult
init {
println(isAdult) // null
isAdult = true
println(isAdult) // true
isAdult.value = false
println(isAdult) // false
sharedPreferences.isAdultX = true
println(isAdult) // true
}
}
class SharedPreferencesX {
companion object {
var SharedPreferences.isAdultX by ofBoolean { PREF_IS_ADULT } // How can we do something like this?
}
}
val SharedPreferences.isAdult get() = ofBoolean { PREF_IS_ADULT }
const val PREF_IS_ADULT = "isAdult"
fun SharedPreferences.ofBoolean(
onKey: () -> String,
): MutableSharedPreferencesState<Boolean?> = BooleanPreference(
onKey = onKey,
sharedPreferences = this,
scope = scope,
)
class BooleanPreference(
private val sharedPreferences: SharedPreferences,
private val onKey: () -> String,
): MutableSharedPreferencesState<Boolean?> {
override var value: Boolean?
get() = sharedPreferences.getBooleanOrNull(onKey())
set(value) {
sharedPreferences.edit { putOrNull(onKey(), value) }
}
override fun component1(): Boolean? = value
override fun component2(): (Boolean?) -> Unit = { value = it }
}
fun SharedPreferences.getBooleanOrNull(key: String) =
if (contains(key)) getBoolean(key, false) else null
fun SharedPreferences.Editor.putOrNull(key: String, value: Boolean?): SharedPreferences.Editor =
if (value != null) putBoolean(key, value)
else remove(key)
interface SharedPreferencesState<T> {
val value: T
}
interface MutableSharedPreferencesState<T> : SharedPreferencesState<T> {
override var value: T
operator fun component1(): T
operator fun component2(): (T) -> Unit
}
operator fun <T> SharedPreferencesState<T>.getValue(thisObj: Any?, property: KProperty<*>): T = value
operator fun <T> MutableSharedPreferencesState<T>.setValue(thisObj: Any?, property: KProperty<*>, value: T) {
this.value = value
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment