Изучение
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 во все приватные страницы только ради выхода из аккаунта.