Изучение

Redirect и Guard

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

v1.1.0Начальный уровень

Redirect и Guard

Redirect нужен, когда переход должен продолжиться к другой Destination. Guard нужен, когда переход следует остановить.

Отправить пользователя на Login

dart
final class AuthenticationRedirect implements NavigationRedirect {
  AuthenticationRedirect(this.session);
  final SessionState session;

  @override
  NavigationTarget<Object?>? redirect(NavigationPolicyContext context) {
    final target = context.target.destination;
    if (session.isSignedIn || target is LoginDestination) return null;
    return NavigationTarget<Object?>(
      destination: LoginDestination(returnTo: target),
    );
  }
}

Защищённая страница не отображается. Login получает типизированную цель возврата.

Запретить вход без выбора другой страницы

dart
enum AccessDeniedReason { subscriptionRequired }

if (context.phase == NavigationGuardPhase.enter && !account.isPremium) {
  return const NavigationGuardDenied(
    reason: AccessDeniedReason.subscriptionRequired,
  );
}
return const NavigationGuardAllowed();

Вызывающий код получит NavigationRejected и сам решит, показывать ли сообщение или экран оплаты.

Защитить несохранённый редактор

Проверяйте фазу leave. Guard возвращает причину отказа, а диалог подтверждения показывает UI. После подтверждения измените состояние редактора и повторите переход.

Отреагировать на выход из аккаунта

dart
NavigationSession(
  id: const NavigationSessionId('main'),
  graph: createGraph(sessionState),
  policyRefresh: ListenableNavigationPolicyRefresh(sessionState),
)

После notifyListeners() открытая приватная страница проходит политику повторно. Не нужно внедрять NavigationPort во все приватные страницы только ради выхода из аккаунта.