Как реализовать условную навигацию в компонентах архитектуры навигации

Как реализовать условную навигацию в новом компоненте архитектуры навигации?

В настоящее время у меня есть одно действие с LoginFragment и HomeFragment. Основываясь на определенном login_flag, я использовал для вызова любого фрагмента из MainActivity. Поскольку LoginFragment вызывается только один раз, я установил startDestination в HomeFragment, и навигация загружает этот HomeFragment. Есть ли способ проверить флажок login_flag, прежде чем навигация загружает HomeFragment.

3 ответа

Вот как я справляюсь с условной навигацией:

  1. Установить HomeFragment в качестве начального пункта назначения
  2. Создать глобальное действие для LoginFragment

    <action
        android:id="@+id/action_global_loginFragment"
        app:destination="@id/loginFragment"
        app:launchSingleTop="false"
        app:popUpTo="@+id/nav_graph"
        app:popUpToInclusive="true" />
    
  3. Выполнить условную навигацию внутри onViewCreated:

    // HomeFragment.kt
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
    
        if(!appAuth.isAuthenticated()) {
            view.findNavController().navigate(R.id.action_global_loginFragment)
        }
    }
    

Вы можете добавить прослушиватель навигации внутри своей деятельности и оттуда перейти к LoginFragment в зависимости от ваших условий, например:

findNavController(nav_host_fragment).addOnNavigatedListener { controller, destination ->
        when(destination.id) {
            R.id.HomeFragment-> {
             if(someCondition) {
               //Navigate to LoginFragment
             }

        }
    }

Хочу добавить, что для этого есть на сайте developer.android.comкодовая лаборатория .

Во всех требуемых фрагментах вы определяете "next_action" (идентификаторы, очевидно, не обязательно должны быть уникальными) следующим образом:

      <action
    android:id="@+id/next_action"
    app:popUpTo="@id/home_dest">
</action>

Затем, условно, вы можете установить onClickListeners в своем коде:

      view.findViewById<Button>(R.id.navigate_action_button)?.setOnClickListener(
    Navigation.createNavigateOnClickListener(R.id.next_action, null)
)
Другие вопросы по тегам