Как сбросить базовый маршрут в моем приложении Flutter - найти любые маршруты и заменить их новым с помощью навигатора

Я новичок во Flutter, прошу меня простить, если это очевидно, но я прочитал документацию и попробовал несколько параметров навигатора, но ни один из них не работает так, как мне хотелось бы. Набор проблем: у нас есть сложная (ну, полусложная) серия экранов и т. д., Которые обрабатывают процесс входа / авторизации / регистрации. Это может быть 3 или 4 уровня в стеке маршрутов. Все в порядке - не беспокойтесь.

Проблема возникает, когда мы получаем успешное событие входа в систему (из нескольких разных путей) и хотим перейти на «домашнюю» страницу. Как только мы окажемся на домашней странице, она должна стать новым «корнем» дерева маршрутов (я уверен, что это неправильная терминология, но я думаю, что идея прочная).

Итак, учитывая, что мы можем быть на 1/2/3 или даже на 4 уровня ниже и хотим «вытолкнуть» и заменить весь стек (с любыми событиями перехода, пожалуйста) на новый корень верхнего уровня - какой волшебный набор или методы навигатора будут сделать это чисто?

Мой текущий (ужасный) подход состоит в том, чтобы передать уровни "pop ()" и выполнить вызов Navigator.pushReplacementNamed () (все они названы маршрутами), но это не общее решение (нужно точно знать, сколько уровней) и, что еще хуже, это вызывает переход "анимации" в "всплывающий" на экране на долю секунды для каждого pop (), что выглядит .. не очень хорошо.

TIA!

15
0
13 499
3

Ответы 3

Попробуйте этот код:

    Navigator.pushAndRemoveUntil(
                    context,
                    MaterialPageRoute(
                      builder: (BuildContext context) => YourInitialPage(),
                    ),
                    ModalRoute.withName('/'));

Если вам не нужен переход, вы можете переопределить или расширить класс MaterialPageRoute.

Навигатор выставил больше, чем просто pop. Вы можете делать следующее:

Navigator.pushNamedAndRemoveUntil(context, '/', (_) => false);

Это в основном подтолкнет дом и удалит все маршруты за новым

Это действительно сработало как шарм! Я просмотрел этот призыв, но не мог понять, каким должен быть третий аргумент. Все еще читаю документ, я все еще не уверен, какова общая цель этого "нормального" основания ... но это работает для моих целей !!

sjmcdowall 28.08.2018 01:31

Эта функция решает, останавливать ли всплывающее окно или нет, основываясь на деталях маршрута. Но в вашем случае вы просто хотите все выскочить

Rémi Rousselet 28.08.2018 01:32

Ага! Черт возьми - это похоже на волшебный трюк - как только ты знаешь, как это делается - это больше не загадка! Еще раз спасибо!

sjmcdowall 28.08.2018 12:54

Обязательно поднимите свои объекты состояния над своими маршрутами (при использовании шаблона Consumer / ChangeNotifierProvider, в противном случае ваши объекты состояния будут удалены. (Усвоил это на собственном горьком опыте)

John Evans 24.05.2019 22:09

@johnevans есть ли у вас пример объектов состояния "над" маршрутами?

camillo777 20.11.2019 10:17

@ RémiRousselet не работает в моем случае.

s.j 23.12.2020 07:28

он просто отключает обратное нажатие на месте '/', какой маршрут определять, иначе он будет пустым.

s.j 23.12.2020 07:44

Хорошая новость в том, что теперь мы можем использовать pushReplacementNamed.

Navigator.pushReplacementNamed(context, '/');

(Мастер каналов, v1.15.4-pre.97, я не уверен, что предыдущая версия может это сделать)

Разве это не просто заменит маршрут на вершине стека?

EzPizza 22.06.2021 23:10

@EzPizza, вы правы, но если вы используете этот метод для всех ссылок в своей навигации / ящике, он даст тот же результат :)

Yotam Omer 17.07.2021 16:27

Другие вопросы по теме