Задний стек навигации теряется при вложении навигации - PullRequest
3 голосов
/ 30 мая 2019

У меня есть навигация, которая выглядит следующим образом

Frag1 -> Frag2 -> Frag3

Внутри Frag2 есть NavHostFragment с собственной навигацией

InnerFrag1 -> InnerFrag2

Если я сделаю это

  1. Перейти к Frag2
  2. Перейти к InnerFrag2 внутри Frag2
  3. Перейти к Frag3
  4. Вернуться назад

тогда я увижу InnerFrag2 внутри Frag2, при нормальном нажатии я бы пошел от InnerFrag2 до InnerFrag1 внутри Frag2, но теперь вместо этого он будет Frag1.

Вот моя обработка навигации внутри Frag2


    private val backPressedCallback = OnBackPressedCallback {
        navHostFragment.navController.navigateUp()
    }


    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        requireActivity().addOnBackPressedCallback(backPressedCallback)
    }

    override fun onDestroyView() {
        activity?.removeOnBackPressedCallback(backPressedCallback)
        super.onDestroyView()
    }

    private val navHostFragment: NavHostFragment
        get() = childFragmentManager.findFragmentById(R.id.innerNavHostFragment) as NavHostFragment

При возвращении к Frag2 фрагмент в хосте nav является правильным, но навигация назад отходит от Frag2, потому что внутренняяЗадний стек хоста nav потерян.Могу ли я как-то это сохранить или исправить другим способом?

РЕДАКТИРОВАТЬ: на самом деле при переходе от Frag3 к Frag2 Я вижу InnerFrag1 внутри, оба выглядят одинаково, этопочему возвращение в этот момент возвращает меня к Frag1

EDIT2: Я нашел свою проблему, я надуваю Frag2 s навигацию из кода в onViewCreated, как это

    val navHostFragment = (frag2NavHostFragment as? NavHostFragment) ?: return
    val inflater = navHostFragment.navController.navInflater
    val graph = inflater.inflate(navigationId)
    navHostFragment.navController.graph = graph

установка в xml заставляет его работать, мне все равно нужно каким-то образом установить его из кода, Frag2 выбирает, какую навигацию использовать в зависимости от аргументов

Теперь мой вопрос меняется с Navigation's back stack is lostдо How to preserve NavHostFragment's state when settings it's graph from code

Ответы [ 2 ]

0 голосов
/ 30 мая 2019

Изучив этот вопрос немного, оригинальный вопрос не имеет особого смысла, я бы удалил его, но он получил 2 отзыва ¯ \ _ (ツ) _ / ¯

Я решил свою проблему, добавив проверку перед накачкой графика, чтобы график NavHostFragment устанавливался только в том случае, если у него его еще нет.

    try {
        navHostFragment.navController.graph
    } catch (e: IllegalStateException) {
        val inflater = navHostFragment.navController.navInflater
        val graph = inflater.inflate(navigationId)
        navHostFragment.navController.graph = graph
    }

NavController.getGraph не возвращает ноль, вместо этого выбрасывает IllegalStateException, отсюда и странная проверка

0 голосов
/ 30 мая 2019

Теперь вы можете обрабатывать onBackPress на фрагментах. В вашем фрагменте просто добавьте это в onViewCreated метод.

val navController = Navigation.findNavController(view)
        requireActivity().onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                navController.popBackStack(R.id.fragmentWhereYouWantToGo, false)
            }
        })

Я бы также дал проверку app:popUpTo, app:popUpToInclusive или singleTop атрибутам XML на фрагменты внутри вашего Frag2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...