observeEvent

inline fun <T> LifecycleOwner.observeEvent(liveData: LiveData<OneTimeEvent<T>>, crossinline action: (T) -> Unit)

Observes a LiveData containing OneTimeEvents and consumes unhandled events.

This extension is specifically designed for OneTimeEvent wrapped in LiveData, ensuring events are only consumed once even if the Activity/Fragment is recreated. Perfect for navigation events, snackbar messages, and other one-time actions.

Usage for Navigation Events

class MyFragment : Fragment() {
private val viewModel: MyViewModel by viewModels()

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

observeEvent(viewModel.navigationEvent) { destination ->
findNavController().navigate(destination)
}
}
}

Usage for Snackbar Messages

observeEvent(viewModel.snackbarMessage) { message ->
Snackbar.make(binding.root, message, Snackbar.LENGTH_SHORT).show()
}

ViewModel Side

class MyViewModel : ViewModel() {
private val _navigationEvent = MutableLiveData<OneTimeEvent<String>>()
val navigationEvent: LiveData<OneTimeEvent<String>> = _navigationEvent

fun navigateToDetails() {
_navigationEvent.value = OneTimeEvent("details_screen")
}
}

Parameters

liveData

LiveData containing OneTimeEvents

action

Callback invoked with unhandled event content

Type Parameters

T

The type of event data

See also


inline fun <T> LifecycleOwner.observeEvent(liveData: MutableLiveData<OneTimeEvent<T>>, crossinline action: (T) -> Unit)

Observes a MutableLiveData containing OneTimeEvents and consumes unhandled events.

This is an overload of observeEvent for MutableLiveData. Functionally identical to the LiveData variant but accepts MutableLiveData directly.

Parameters

liveData

MutableLiveData containing OneTimeEvents

action

Callback invoked with unhandled event content

Type Parameters

T

The type of event data

See also