web-dev-qa-db-fra.com

Le comportement pop du composant de navigation ne fonctionne pas comme il se doit

Dans une application que je construis, j'ai utilisé l'architecture à activité unique et j'ai décidé d'utiliser le nouveau composant de navigation de Google pour naviguer dans l'application.
Bien qu'il soit très prometteur, il présente certains inconvénients dont ma question concerne l'un d'entre eux.

Supposons que nous ayons trois fragments qui sont parcourus dans l'ordre, sauf que nous voulons revenir au premier lorsque le bouton de retour est cliqué lorsque nous sommes sur le troisième fragment. Voici comment ça se passe:

Navigation from one to two to three

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:id="@+id/main_nav_graph.xml"
    app:startDestination="@id/firstFragment">

    <fragment
        Android:id="@+id/firstFragment"
        Android:name="com.hmomeni.navisample.FirstFragment"
        Android:label="fragment_first"
        tools:layout="@layout/fragment_first" >
        <action
            Android:id="@+id/action_firstFragment_to_secondFragment"
            app:destination="@id/secondFragment" />
    </fragment>
    <fragment
        Android:id="@+id/secondFragment"
        Android:name="com.hmomeni.navisample.SecondFragment"
        Android:label="fragment_second"
        tools:layout="@layout/fragment_second" >
        <action
            Android:id="@+id/action_secondFragment_to_thirdFragment"
            app:destination="@id/thirdFragment"
            app:popUpTo="@+id/firstFragment" />
    </fragment>
    <fragment
        Android:id="@+id/thirdFragment"
        Android:name="com.hmomeni.navisample.ThirdFragment"
        Android:label="fragment_third"
        tools:layout="@layout/fragment_third" />
</navigation>

Le problème ici est que lorsque je veux répéter la navigation pour la deuxième fois, une exception se produit me disant que:

Java.lang.IllegalArgumentException: destination de navigation com.hmomeni.navisample: id/action_firstFragment_to_secondFragment est inconnu de ce NavController

Une enquête plus approfondie montre qu'en appuyant sur le bouton de retour et en revenant au premier fragment, le navController.currentDestination fait toujours référence au ThirdFragment qui est incorrect et qui devrait être FirstFragment.

Toute aide à ce sujet est appréciée.

5
Hamed Momeni

Je crois que c'est un double de la question ici - si c'est le cas, c'est un bug dans alpha04 ; essayez de passer à alpha05.

0
Lyla

J'avais un problème similaire à cette question mais avec une navigation circulaire, où la pile arrière n'était pas sautée. Lors de la navigation depuis C -> A, je définissais par erreur le paramètre pour navigate(int resId) comme R.id.fragmentC

au lieu d'utiliser une action comme

R.id.action_c_to_a

2
Eric B.

J'ai trouvé une solution de contournement, même si je n'appellerais pas cela une solution.
Pour contourner ce problème, vous pouvez créer une action de ThirdFragment à elle-même, puis rechercher navController.currentDestination lorsque la navigation est appelée.

Je n'accepterais pas cette réponse faute d'une vraie solution.

0
Hamed Momeni