Рецепты

Аутентификация, доступ и несохранённые изменения

Redirect на Login, отказ в доступе, защита несохранённых изменений и повторная проверка после выхода.

v1.1.0Средний уровень

Аутентификация, доступ и несохранённые изменения

Нет сессии: открыть Login

Реализуйте NavigationRedirect и верните LoginDestination. Не вызывайте push внутри Redirect.

dart
if (!session.isSignedIn && context.target.destination is AccountDestination) {
  return const NavigationTarget<Object?>(destination: LoginDestination());
}
return null;

Нет разрешения: оставить текущий экран

dart
if (context.phase == NavigationGuardPhase.enter && !permissions.canManageUsers) {
  return const NavigationGuardDenied(reason: AccessReason.missingPermission);
}
return const NavigationGuardAllowed();

Вызывающий код получает NavigationRejected и выбирает способ отображения.

Есть несохранённые изменения

На фазе leave верните NavigationGuardDenied. Guard только сообщает об отказе: диалог подтверждения показывается снаружи. После согласия пользователя пометьте изменения сохранёнными или разрешите выход и повторите переход.

Пользователь вышел при открытом Account

Передайте ListenableNavigationPolicyRefresh(sessionState) в NavigationSession. После notifyListeners() политика будет применена к уже открытому Account. Поэтому NavigationPort не нужно передавать во все приватные страницы только ради обработки выхода.