Можно ли использовать DI с androidx.navigation.NavController - PullRequest
0 голосов
/ 06 марта 2019

Итак, название этого вопроса отражает вопрос.чтобы получить ссылку на навигационный контроллер (androidx.navigation.NavController), обычно мы используем следующий код:

NavController navController = Navigation.findNavController(this, R.id.nav_host_frag);

Возможно ли ввести в NavController с использованием Dagger2 framework?(findNavController требует действия или ссылки на представление) Возможно, это глупый вопрос, и никто не вводит androidx.navigation.NavController, но, тем не менее, я решил задать этот вопрос, чтобы быть уверенным в своих предположениях.Спасибо вперед

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Я не понимаю, почему вы захотите внедрить 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)
)
0 голосов
/ 06 марта 2019

Почему это не должно работать? Вы можете добавить его как любой другой объект к компоненту

  • через Component.Builder через @BindsInstance или модуль с аргументом
  • , возвращая его из аннотированного метода @Provides

Используя аннотированный метод @Provides, вы также должны иметь доступ к Activity или View в компоненте. В зависимости от того, как вы используете Dagger, вам обычно будет доступна конкретная активность, поэтому вы можете просто использовать ее, например, для MyActivityComponent с MyActivity вы можете просто вернуть его в модуле

@Provides
NavController bindController(MyActivity activity) {
  Navigation.findNavController(this, R.id.nav_host_frag)
}
...