Skip to content

Instantly share code, notes, and snippets.

@Bloody-Badboy
Created May 3, 2020 16:52
Show Gist options
  • Save Bloody-Badboy/9e1f0f8d63049930843d96fe0bd6eb99 to your computer and use it in GitHub Desktop.
Save Bloody-Badboy/9e1f0f8d63049930843d96fe0bd6eb99 to your computer and use it in GitHub Desktop.
import androidx.lifecycle.Observer
/**
* Used as a wrapper for data that is exposed via a LiveData that represents an event.
*/
open class Event<out T>(private val content: T) {
var hasBeenHandled = false
private set // Allow external read but not write
/**
* Returns the content and prevents its use again.
*/
fun getContentIfNotHandled(): T? {
return if (hasBeenHandled) {
null
} else {
hasBeenHandled = true
content
}
}
/**
* Returns the content, even if it's already been handled.
*/
fun peekContent(): T = content
}
/**
* An [Observer] for [Event]s, simplifying the pattern of checking if the [Event]'s content has
* already been handled.
*
* [onEventUnhandledContent] is *only* called if the [Event]'s contents has not been handled.
*/
open class EventObserver<T>(private val onEventUnhandledContent: (T) -> Unit) : Observer<Event<T>> {
override fun onChanged(event: Event<T>?) {
event?.getContentIfNotHandled()
?.let { value ->
onEventUnhandledContent(value)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment