Выбор ответа Middle Навигация обновлено
go_router: защита маршрутов
Вопрос
Как в go_router сделать, чтобы неавторизованный пользователь всегда попадал на /login, а после выхода автоматически перебрасывался туда же?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: redirect возвращает /login, refreshListenable перепроверяет при изменениях. redirect вызывается при каждой навигации и может вернуть другой адрес (или null, если всё в порядке).
Варианты ответа
- Проверять авторизацию в
buildкаждого экрана и вызывать оттудаcontext.go('/login') - Создать два разных
MaterialAppи переключать их черезsetStateв корне приложения redirectвозвращает/login,refreshListenableперепроверяет при измененияхправильный ответ- Поставить
PopScopeсonPopInvokedWithResultна каждый экран, требующий входа
Разбор
redirect вызывается при каждой навигации и может вернуть другой адрес (или null, если всё в порядке). Без refreshListenable роутер не узнает о выходе, пока не будет следующей навигации. Навигация из build вызывает побочные эффекты при каждом перестроении. Два MaterialApp теряют состояние и навигационный стек. PopScope про кнопку «назад», а не про доступ.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.