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.
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