Passer au contenu principal

Graphique de navigation

Le graphe de navigation est déclaré de manière centralisée dans MainActivity.kt à l'aide d'un NavHost. La destination de départ est toujours splash.

Itinéraires définis​

ItinéraireComposableArgumentsAccessible depuis
splashSplashVideoScreenningunoDébut de l'application
loadingPantalon de chargement intermédiaireningunosplash (pour compléter la vidéo)
mainMainScreenningunoloading
loginLoginScreenningunomain
registerRegisterScreenningunologin
forgotForgotPasswordScreenningunologin
profile/{idUsuario}ProfileScreenIntlogin / loading (session gardée)
edit_profile/{idUsuario}EditProfileScreenIntprofile
historial/{idUsuario}HistorialScreenIntedit_profile
premium_selection/{idUsuario}PremiumSelectionScreenIntprofile / edit_profile
maquinas/{isAdmin}/{idUsuario}MaquinasScreenInt, Intprofile
reservas/{isAdmin}/{idUsuario}ReservasScreenInt, Intprofile
platos/{isAdmin}/{idUsuario}PlatosScreenInt, Intprofile
registro/{idUsuario}RegistroScreenIntprofile

Flux de navigation principal​

[splash]
|
v (onVideoFinished → popUpTo splash inclusive)
[loading] ─── sesión válida guardada ──────────────────────────> [profile/{idUsuario}]
|
v (sin sesión)
[main]
|
v (onNavigateToLogin)
[login]
|---> [register] (onNavigateToRegister)
|---> [forgot] (onNavigateToForgot)
|
v (onLoginSuccess: idUsuario)
[profile/{idUsuario}]
|---> [maquinas/{isAdmin}/{idUsuario}] (onNavigateToMaquinas)
|---> [platos/{isAdmin}/{idUsuario}] (onNavigateToPlatos)
|---> [registro/{idUsuario}] (onNavigateToRegistroPeso)
|---> [reservas/{isAdmin}/{idUsuario}] (onNavigateToReservas)
|---> [edit_profile/{idUsuario}] (onNavigateToEditProfile)
|---> [premium_selection/{idUsuario}] (onNavigateToPremium)
|---> [main] popUpTo(0) (onLogout)
|
v (edit_profile)
[edit_profile/{idUsuario}]
|---> [historial/{idUsuario}] (onNavigateToHistorial)
|---> [premium_selection/{idUsuario}] (onNavigateToPremium)

Écran de chargement​

La route loading sert d'intermédiaire entre le splash et le reste de l'application. Lors de la saisie de loading, une vérification est effectuée pour voir si une session enregistrée valide existe sur SecureSessionManager. Si tel est le cas, accédez directement à profile/{idUsuario} pour récupérer l’ID utilisateur de session. Si aucune session n’existe, accédez à main.

Ce comportement permet aux utilisateurs authentifiés de ne pas avoir à se reconnecter à chaque démarrage de l'application.

Gestion de la pile arrière​

La destination splash est supprimée de la pile arrière lors de la navigation vers loading à l'aide de popUpTo("splash") { inclusive = true }, empêchant l'utilisateur de pouvoir revenir à l'écran vidéo avec le bouton Précédent.

Lors de la déconnexion de ProfileScreen, popUpTo(0) est exécuté pour effacer complètement la pile arrière avant de naviguer vers main, empêchant l'accès aux écrans protégés via le bouton Retour du système. De plus, SecureSessionManager.cerrarSesion() efface les données de session persistantes.

Passer des booléens sous forme d'entiers​

Navigation Compose ne prend pas en charge Boolean comme type d'argument de navigation. Par conséquent, le champ isAdmin est transporté sous la forme Int (0 ou 1) et est converti par comparaison lorsqu'il est extrait de Bundle :

val isAdmin = backStackEntry.arguments?.getInt("isAdmin") == 1

Lors de la navigation, la conversion inverse se fait avec l'opérateur ternaire :

navController.navigate("maquinas/${if (isAdmin) 1 else 0}/$idUsuario")

Gestion de la barre système​

MainActivity.kt réagit aux changements d'itinéraire en utilisant SideEffect pour adapter la couleur et le style des barres d'état et de navigation du système :

  • Sur l'itinéraire splash : fond blanc, icônes sombres, barre de navigation visible.
  • Dans le reste des parcours : fond adapté au thème (foncé #0B1426 / clair #F0F4FF), icônes selon le thème, barre de navigation cachée (affichée par glissement).