Jetpack навигация, открывающая предыдущий экран - PullRequest
0 голосов
/ 29 марта 2020

У меня есть эта простая навигационная настройка, состоящая из 3 экранов:

Screen 1 -> Screen 2 -> Screen 3
    |______________________^

Экран 2 - это форма регистрации, которую можно пропустить, если ее заполнить один раз.

У меня странная проблема с График навигации Jetpack, на котором при переходе с экрана 2 -> 3 приложение зависало из-за активированного экрана 1 (!) onViewCreated() и направления навигации не найдены:

    java.lang.IllegalArgumentException: navigation destination 
com.example.app:id/action_screen1_to_screen3 is unknown to this NavController

Мой график навигации:

   <fragment
        android:id="@+id/screen1"
        android:name="Screen1Fragment"
        android:label="Screen 1"
        tools:layout="@layout/fragment_screen_1">
        <action
            android:id="@+id/action_screen1_to_screen2"
            app:destination="@id/screen2"
            app:launchSingleTop="false"/>
        <action
            android:id="@+id/action_screen1_to_screen3"
            app:destination="@id/screen3"
            app:launchSingleTop="false"
            app:popUpTo="@id/screen1"
            app:popUpToInclusive="true" />
    </fragment>
    <fragment
        android:id="@+id/screen2"
        android:name="Screen2Fragment"
        android:label="Screen 2"
        tools:layout="@layout/fragment_screen_2">
        <action
            android:id="@+id/action_screen2_to_screen3"
            app:destination="@id/screen3"
            app:launchSingleTop="false"
            app:popUpTo="@id/screen2"
            app:popUpToInclusive="true" />
    </fragment>
    <fragment
        android:id="@+id/screen3"
        android:name="Screen3Fragment"
        android:label="Screen 3"
        tools:layout="@layout/fragment_screen_3">
    </fragment>

Я использую автоматически сгенерированные NavDirections, поэтому не нужно использовать неправильный идентификатор ресурса.

Код навигации:

// Screen 1
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        if (isLoggedIn) {
            view?.findNavController()
                ?.navigate(Screen1FragmentDirections.screen1ToSelectScreen3())
        } else {
            signInButton.setOnClickListener {
                val action =
                    Screen1FragmentDirections.screen1ToScreen2()
                view?.findNavController()?.navigate(action)
            }
        }
    }

// Screen 2
view?.findNavController()?.navigate(Screen2FragmentDirections.screen2ToScreen3())

Мой импорт Gradle:

    def nav_version = "2.3.0-alpha04"
    implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
    implementation "androidx.navigation:navigation-ui-ktx:$nav_version"

Любая помощь приветствуется, спасибо!

1 Ответ

1 голос
/ 01 апреля 2020

Не уверен, почему это происходит, но решение, которое я нашел, было вместо popUpTo до текущего экрана, это popUpTo для всего графика навигации:

[...]
app:popUpTo="@id/nav_graph"
app:popUpToInclusive="true"
[...]
...