Я новичок во Flutter, прошу меня простить, если это очевидно, но я прочитал документацию и попробовал несколько параметров навигатора, но ни один из них не работает так, как мне хотелось бы. Набор проблем: у нас есть сложная (ну, полусложная) серия экранов и т. д., Которые обрабатывают процесс входа / авторизации / регистрации. Это может быть 3 или 4 уровня в стеке маршрутов. Все в порядке - не беспокойтесь.
Проблема возникает, когда мы получаем успешное событие входа в систему (из нескольких разных путей) и хотим перейти на «домашнюю» страницу. Как только мы окажемся на домашней странице, она должна стать новым «корнем» дерева маршрутов (я уверен, что это неправильная терминология, но я думаю, что идея прочная).
Итак, учитывая, что мы можем быть на 1/2/3 или даже на 4 уровня ниже и хотим «вытолкнуть» и заменить весь стек (с любыми событиями перехода, пожалуйста) на новый корень верхнего уровня - какой волшебный набор или методы навигатора будут сделать это чисто?
Мой текущий (ужасный) подход состоит в том, чтобы передать уровни "pop ()" и выполнить вызов Navigator.pushReplacementNamed () (все они названы маршрутами), но это не общее решение (нужно точно знать, сколько уровней) и, что еще хуже, это вызывает переход "анимации" в "всплывающий" на экране на долю секунды для каждого pop (), что выглядит .. не очень хорошо.
TIA!
Попробуйте этот код:
Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(
builder: (BuildContext context) => YourInitialPage(),
),
ModalRoute.withName('/'));
Если вам не нужен переход, вы можете переопределить или расширить класс MaterialPageRoute.
Навигатор выставил больше, чем просто pop. Вы можете делать следующее:
Navigator.pushNamedAndRemoveUntil(context, '/', (_) => false);
Это в основном подтолкнет дом и удалит все маршруты за новым
Эта функция решает, останавливать ли всплывающее окно или нет, основываясь на деталях маршрута. Но в вашем случае вы просто хотите все выскочить
Ага! Черт возьми - это похоже на волшебный трюк - как только ты знаешь, как это делается - это больше не загадка! Еще раз спасибо!
Обязательно поднимите свои объекты состояния над своими маршрутами (при использовании шаблона Consumer / ChangeNotifierProvider, в противном случае ваши объекты состояния будут удалены. (Усвоил это на собственном горьком опыте)
@johnevans есть ли у вас пример объектов состояния "над" маршрутами?
@ RémiRousselet не работает в моем случае.
он просто отключает обратное нажатие на месте '/', какой маршрут определять, иначе он будет пустым.
Хорошая новость в том, что теперь мы можем использовать pushReplacementNamed.
Navigator.pushReplacementNamed(context, '/');
(Мастер каналов, v1.15.4-pre.97, я не уверен, что предыдущая версия может это сделать)
Разве это не просто заменит маршрут на вершине стека?
@EzPizza, вы правы, но если вы используете этот метод для всех ссылок в своей навигации / ящике, он даст тот же результат :)
Это действительно сработало как шарм! Я просмотрел этот призыв, но не мог понять, каким должен быть третий аргумент. Все еще читаю документ, я все еще не уверен, какова общая цель этого "нормального" основания ... но это работает для моих целей !!