Выбор ответа Middle Навигация обновлено

go_router: защита маршрутов

Вопрос

Как в go_router сделать, чтобы неавторизованный пользователь всегда попадал на /login, а после выхода автоматически перебрасывался туда же?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: redirect возвращает /login, refreshListenable перепроверяет при изменениях. redirect вызывается при каждой навигации и может вернуть другой адрес (или null, если всё в порядке).

Варианты ответа

  1. Проверять авторизацию в build каждого экрана и вызывать оттуда context.go('/login')
  2. Создать два разных MaterialApp и переключать их через setState в корне приложения
  3. redirect возвращает /login, refreshListenable перепроверяет при измененияхправильный ответ
  4. Поставить PopScope с onPopInvokedWithResult на каждый экран, требующий входа

Разбор

redirect вызывается при каждой навигации и может вернуть другой адрес (или null, если всё в порядке). Без refreshListenable роутер не узнает о выходе, пока не будет следующей навигации. Навигация из build вызывает побочные эффекты при каждом перестроении. Два MaterialApp теряют состояние и навигационный стек. PopScope про кнопку «назад», а не про доступ.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме