You can provide a custom Navigator for this.
instead of FragmentNavigator
by
NavController.getNavigatorProvider().addNavigator().
your custom Navigator must be annotated
@Navigator.Name("fragment")
For example
@Navigator.Name("fragment")
class HookFragmentNavigator(private val delegate: FragmentNavigator) :
Navigator<FragmentNavigator.Destination>() {
override fun navigate(
destination: FragmentNavigator.Destination,
args: Bundle?,
navOptions: NavOptions?,
navigatorExtras: Extras?
): NavDestination? {
"hook delegate navigate".println()
return delegate.navigate(destination, args, navOptions, navigatorExtras)
}
override fun createDestination(): FragmentNavigator.Destination {
return delegate.createDestination()
}
override fun popBackStack(): Boolean {
return delegate.popBackStack()
}
}
findNavController(R.id.fragment).apply {
navigatorProvider.addNavigator(
HookFragmentNavigator(navigatorProvider.getNavigator(FragmentNavigator::class.java))
)
}.navigate(
it,
null,
NavOptions.Builder().setAnimal().build()
)