web-dev-qa-db-fra.com

Fragment xxx {} non associé à un gestionnaire de fragments

J'ai commencé à utiliser la composante de navigation dans mon application et je suis confronté au problème suivant. Mon premier fragment est loginfragment. Après une connexion de succès, le mainfrogment est affiché. Je souhaite que lorsque l'utilisateur se trouve sur Mainfragment et appuyez sur la touche BACK pour ne pas revenir à la connexion. Pour cela, j'ai ajouté ces 2 lignes dans NAV_Graph: app:popUpTo="@+id/lovable_app_navigation" et app:popUpToInclusive="true" et ça marche bien. Voici mon graphique de navigation:

<?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/app_navigation"
  app:startDestination="@id/loginFragment">

  <fragment
    Android:id="@+id/loginFragment"
    Android:name="com.xxx.LoginFragment"
    Android:label="LoginFragment"
    tools:layout="@layout/login_fragment">
    <action
      Android:id="@+id/dashboard_action"
      app:destination="@id/mainFragment"
      app:launchSingleTop="true"
      app:popUpTo="@+id/app_navigation"
      app:popUpToInclusive="true"/>
  </fragment>

  <fragment
    Android:id="@+id/mainFragment"
    Android:name="com.xxx.MainFragment"
    Android:label="MainFragment"
    tools:layout="@layout/main_fragment">
       <action
      Android:id="@+id/logout_action"
      app:destination="@id/loginFragment"
      app:launchSingleTop="true"
      app:popUpTo="@+id/app_navigation"
      app:popUpToInclusive="true"/>
  </fragment>

  <action
    Android:id="@+id/action_global_loginFragment"
    app:destination="@id/loginFragment" />
</navigation>

Le problème est qu'après un moment, lorsque ma session expire, peu importe où l'utilisateur est en application, dans lequel le fragment, je dois afficher le loginfragment sur toute la pile. J'ai créé une action globale pour cette action_global_loginFragment. Le problème est que lorsque je vais naviguer vers la connexion, je reçois cette erreur:

Java.lang.IllegalStateException: Fragment LoginFragment{1d6bd24 (829a6832-3480-4bcb-a3f6-7e2ba214d3ca)} not associated with a fragment manager.

Si je supprimais popUpTo et popUpToInclusive _ Cela fonctionne bien, mais la fonctionnalité du bouton arrière est affectée, à partir de Mainfragment, il retourne à la connexion. Avez-vous une idée de la correction de cela? Merci d'avance.

10
Gabrielle

Le problème est causé lorsque vous essayez d'appeler findNavController() sur un fragment détaché, si vous utilisez Kotlin, vous pouvez créer une fonction d'extension comme si

fun Fragment.findNavControllerSafely(): NavController? {
    return if (isAdded) {
        findNavController()
    } else {
        null
    }
}

ensuite, utilisez-le dans n'importe quel fragment

findNavControllerSafely()?.navigate(/*pass here the nav directions>*/)

vous pouvez également l'entermer avec try/attraper, mais je ne le recommande pas cela car cela attirera/ignorer silencieusement les autres exceptions qui pourraient être utiles, essayez de naviguer dans le code source de findNavController() pour obtenir une meilleure idée de la genre d'exceptions qui sont jetées

1
Mohamed Eleish