const
val DIALOG_RESULT_KEY =
"DialogResult"
inline fun <T> Fragment.getDialogNavResult(
@IdRes
navId: Int, key: String = DIALOG_RESULT_KEY, crossinline onChanged: (T?) -> Unit) {
val backStackEntry = findNavController().getBackStackEntry(navId)
val observer = LifecycleEventObserver { _, event ->
if
(event == Lifecycle.Event.ON_RESUME && backStackEntry.savedStateHandle.contains(key)) {
val result = backStackEntry.savedStateHandle.get<T>(key)
onChanged(result)
backStackEntry.savedStateHandle.remove<T>(key)
}
}
backStackEntry.lifecycle.addObserver(observer)
viewLifecycleOwner.lifecycle.addObserver(
LifecycleEventObserver { _, event ->
if
(event == Lifecycle.Event.ON_DESTROY) {
backStackEntry.lifecycle.removeObserver(observer)
}
}
)
}
fun <T> Fragment.setNavResult(key: String = DIALOG_RESULT_KEY, data: T) {
findNavController().previousBackStackEntry?.also { stack ->
stack.savedStateHandle.set(key, data)
}
}