Изучение
Redirect, Guard и обновление политик
Выбор другой цели, разрешение перехода и реакция на изменение состояния как отдельные контракты.
Redirect, Guard и обновление политик
Redirect отвечает на вопрос «какой типизированный Target должен использоваться вместо исходного?». Guard отвечает на вопрос «разрешён ли переход?». Их объединение приводит к политике, которая меняет Controller во время разрешения текущего запроса.
Политики могут принадлежать Graph, Module, Mount или Route Definition. Redirect обрабатываются раньше Guard. У Guard есть фазы leave и enter, поэтому защита несохранённых изменений не смешивается с контролем доступа к Destination.
final class EditorGuard implements NavigationGuard {
const EditorGuard(this.editor);
final EditorState editor;
@override
NavigationGuardDecision evaluate(NavigationPolicyContext context) {
if (context.phase == NavigationGuardPhase.leave && editor.hasDraft) {
return const NavigationGuardDenied(reason: UnsavedDraft());
}
return const NavigationGuardAllowed();
}
}
Причина отказа принадлежит приложению и может быть enum или sealed-типом. Если авторизация или флаг функции меняются при открытом экране, NavigationPolicyRefresh запускает повторное согласование текущего Destination без ручных команд навигации из каждого функционального модуля.