Skip to content

Instantly share code, notes, and snippets.

@Skyyo
Last active August 16, 2020 11:21
Show Gist options
  • Save Skyyo/22160837d67b510db57d099f3499caad to your computer and use it in GitHub Desktop.
Save Skyyo/22160837d67b510db57d099f3499caad to your computer and use it in GitHub Desktop.
lifecycle aware sp listener #lifecycle #flow #shared_preferences
fun <T> SharedPreferences.observeKey(key: String, default: T): Flow<T> {
return callbackFlow {
send(getItem(key, default))
val listener = SharedPreferences.OnSharedPreferenceChangeListener { _, k ->
if (key == k) {
offer(getItem(key, default))
}
}
registerOnSharedPreferenceChangeListener(listener)
awaitClose {
unregisterOnSharedPreferenceChangeListener(listener)
}
}
}
fun <T> SharedPreferences.getItem(key: String, default: T): T {
@Suppress("UNCHECKED_CAST")
return when (default) {
is String -> getString(key, default) as T
is Int -> getInt(key, default) as T
is Long -> getLong(key, default) as T
is Boolean -> getBoolean(key, default) as T
is Float -> getFloat(key, default) as T
is Set<*> -> getStringSet(key, default as Set<String>) as T
is MutableSet<*> -> getStringSet(key, default as MutableSet<String>) as T
else -> throw IllegalArgumentException("generic type not handled")
}
}
// usage
prefs.observeKey("key", "").collect { string -> }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment