Created
April 21, 2019 08:24
-
-
Save kobeumut/edb3edd9a2ae9abf6984a42bb2de0441 to your computer and use it in GitHub Desktop.
Android Livedata Observe Once Only (Kotlin)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
fun <T> LiveData<T>.observeOnce(lifecycleOwner: LifecycleOwner, observer: Observer<T>) { | |
observe(lifecycleOwner, object : Observer<T> { | |
override fun onChanged(t: T?) { | |
observer.onChanged(t) | |
removeObserver(this) | |
} | |
}) | |
} | |
//Using | |
liveData.observeOnce(this, Observer<Password> { | |
if (it != null) { | |
// do something | |
} | |
}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
val liveData = viewModel.showSnackBar("Hi everyone") | |
liveData.observe(this, object: Observer<String> { | |
override fun onChanged(text: String?) { | |
liveData.removeObserver(this) | |
} | |
}) |
thanks for the solution, however for non-nullable variables with initial value, or for patterns with removing observer on certain conditions, this is helpful
fun <T> LiveData<T>.observeUntil(
owner: LifecycleOwner,
predicate: (T) -> Boolean,
observer: (T) -> Unit
) {
observe(owner, object: Observer<T> {
override fun onChanged(value: T) {
if(predicate(value)) {
removeObserver(this)
}
observer(value)
}
})
}
this can be used as:
val mutLiveData = MutableLiveData(0)
mutLiveData.observeUntil(viewLifecycleOwner, { it == 10}) {
/* code goes here... */
}
Nice!
I have implemented that but when the device configuration changes get the result again. what could we do in that case?
set flag on config change will cost a lot as I have implemented that in many places so, I am looking for optimal solutions
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@kobeumut Thank you for this useful code