Перейти к основному содержанию

График навигации

Граф навигации объявляется централизованно в MainActivity.kt с помощью NavHost. Начальным пунктом назначения всегда является splash.

Определенные маршруты​

РутаСборныйАргументыДоступный дизайн
splashSplashVideoScreenнингуноНачало приложения
loadingПромежуточные сумкинингуноsplash (полное видео)
mainMainScreenнингуноloading
loginLoginScreenнингуноmain
registerRegisterScreenнингуноlogin
forgotForgotPasswordScreenнингуноlogin
profile/{idUsuario}ProfileScreenIntlogin / loading (защитная сессия)
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

Основной процесс навигации​

[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)

Экран загрузки​

Маршрут loading действует как посредник между заставкой и остальной частью приложения. При вводе loading выполняется проверка, существует ли действительный сохраненный сеанс на SecureSessionManager. Если да, перейдите непосредственно к profile/{idUsuario} и получите идентификатор пользователя сеанса. Если сеанса не существует, перейдите к main.

Такое поведение позволяет прошедшим проверку подлинности пользователям не входить в систему заново при каждом запуске приложения.

Управление обратным стеком​

Пункт назначения splash удаляется из заднего стека при переходе к loading с помощью popUpTo("splash") { inclusive = true }, что не позволяет пользователю вернуться к видеоэкрану с помощью кнопки «Назад».

При выходе из ProfileScreen выполняется popUpTo(0), чтобы полностью очистить задний стек перед переходом к main, предотвращая доступ к защищенным экранам с помощью системной кнопки «Назад». Кроме того, SecureSessionManager.cerrarSesion() очищает сохраненные данные сеанса.

Передача логических значений как целых чисел​

Navigation Compose не поддерживает Boolean в качестве типа аргумента навигации. Таким образом, поле isAdmin транспортируется как Int (0 или 1) и преобразуется путем сравнения при получении из Bundle:

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

При просмотре обратное преобразование выполняется с помощью тернарного оператора:

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

Управление системной панелью​

MainActivity.kt реагирует на изменения маршрута, используя SideEffect для адаптации цвета и стиля строк состояния и навигации системы:

  • На маршруте splash: белый фон, темные значки, видимая панель навигации.
  • В остальных маршрутах: фон адаптированный под тему (темный #0B1426/светлый #F0F4FF), иконки согласно теме, скрытая панель навигации (отображается скольжением).