popUpTo, кажется, не работает в компоненте навигации - PullRequest
2 голосов
/ 22 января 2020

, поэтому я использую навигационный компонент android, и у меня проблема (версия 2.2.0-rc04).

У меня есть welcomeFragment (wF). От wF Я хочу перейти к loginSellerFragment (lSF), который находится в другом графике навигации. Я также не хочу удалять wF из backstack (popUpTo, popUpToInclusive) при переходе к lSF, потому что пользователь может захотеть go вернуться к нему.

<fragment
    android:id="@+id/welcomeFragment">
    <action
        android:id="@+id/action_welcomeFragment_to_nav_onboarding_seller"
        app:launchSingleTop="true"
        app:destination="@id/nav_onboarding_seller" />
</fragment>

После перехода к lSF бэкстек выглядит следующим образом: wF lSF

Мы сейчас на lSF, после входа нам нужно go на feedFragment (fF), который снова находится в отдельном графике, но на этот раз мы хотим очистить весь backstack, потому что, если пользователь вошел в систему и нажал назад, он хочет, чтобы приложение закрылось, а не возвращать его к wF или lSF, поэтому я использовал popUpTo="@id/loginSellerFragment popUpToInclusive='true" в действии от lSF до fF.

<fragment
    android:id="@+id/loginSellerFragment">
    <action
        android:id="@+id/action_login_to_seller"
        app:destination="@+id/seller" . //this is the graph that has as firstDestination, feedFragment
        app:launchSingleTop="true"
        app:popUpTo="@id/loginSellerFragment"
        app:popUpToInclusive="true" />
</fragment>

Так что в backstack в этот момент должно быть только fF потому что мы удалили все до lSF (lSF включено)

Проблема

Когда я на fF и нажимаю назад, приложение не закрывается, вместо этого у меня уходит wF (wF уже должно было быть выскочило из стека)

То, что я пробовал

I Я пытался вместо popUpTo="@id/loginSellerFragment popUpToInclusive='true" использовать popUpTo="@id/welcomeFragment popUpToInclusive='true", и он работал нормально, но я почти уверен, что это не так. Что мне здесь не хватает, ребята? Я неправильно строю backstack?

Также я пытался добавить popUpTo="@id/welcomeFragment popUpToInclusive='true" после перехода от wF к lSF, но это нарушит мой пользовательский опыт, потому что я не хочу, чтобы приложение выйти, когда я еще в процессе входа в систему.

Обратите внимание, что все эти фрагменты представлены в отдельных графиках. Для навигации я использую FragmentDirections например: findNavController.navigate(WelcomeFramgentDirections.actionXtoY())

1 Ответ

2 голосов
/ 22 января 2020

Нелегко понять asp, как компонент навигации управляет обратным стеком при использовании опции popUpTo.

Решение, которое вы упомянули в своем вопросе, является правильным: вам действительно следует использовать popUpTo="@id/welcomeFragment" popUpToInclusive="true" вместо popUpTo="@id/loginSellerFragment" popUpToInclusive="true".

Я попытаюсь объяснить, почему.

  • Когда вы запустите ваше приложение, ваш backstack будет пуст, и будет отображаться welcomeFragment.

  • Когда вы переходите от welcomeFragment к loginSellerFragment, у вас будет welcomeFragment в вашем бэкстеке.

  • Чем при входе вы будет переходить от loginSellerFragment к feedFragment, и в backstack у вас будет loginSellerFragment и welcomeFragment.

Поскольку вы использовали popUpTo="@id/welcomeFragment", приложение начнет появляться (удалить) фрагменты из вашего backstack, пока он не достигнет welcomeFragment. welcomeFragment также будет удален, так как мы использовали popUpToInclusive="true".

Backstack должен вести себя как стек FIFO (First In Last Out), так что если вы удалите фрагменты следующим образом:

First верхний фрагмент будет удален, и это loginSellerFragment.

Далее welcomeFragment будет верхним фрагментом. Так как нам нужно всплывать фрагменты, пока мы не достигнем welcomeFragment, мы остановимся на этом, но welcomeFragment также будет удален из-за popUpToInclusive="true", и ваш backstack будет пуст.

Если вы попытаетесь перейти вернувшись из welcomeFragment, вы выйдете из приложения, потому что ваш backstack пуст.

Я надеюсь, что это поможет. Вы также можете прочитать больше о структуре данных стека.

...