Я не понимаю, почему вы захотите внедрить NavController
, когда есть методы, чтобы найти его, также я был бы обеспокоен использованием внедрения зависимостей из-за удержания ссылки на Activity
.
Учитывая, что вы работаете с Activity
, вы обычно находите контроллер, используя следующий метод:
private val navController: NavController by lazy { findNavController(R.id.main_container) }
Теперь, если мы посмотрим на исходный код метода findNavController()
, вы заметите, что он использует функцию расширения и Navigation.findNavController(this, viewId)
.
/**
* Find a [NavController] given the id of a View and its containing
* [Activity].
*
* Calling this on a View that is not a [NavHost] or within a [NavHost]
* will result in an [IllegalStateException]
*/
fun Activity.findNavController(@IdRes viewId: Int): NavController =
Navigation.findNavController(this, viewId)
Единственное, что я хотел бы сделать, чтобы дополнить вышесказанное, - это создать еще одну функцию расширения, облегчающую навигацию с Fragment
.
fun Fragment.navigate(resId: Int, bundle: Bundle? = null) {
NavHostFragment.findNavController(this).navigate(resId, bundle)
}
Тогда вы можете просто использовать внутри фрагмента:
navigate(
R.id.action_fragmentA_to_FragmentB,
bundleOf(Global.CAN_NAVIGATE_BACK to false)
)