#flutter
#flutter
Вопрос:
Я хочу обновить экран при возврате к этому экрану с помощью Navigator.pop
. Например. У меня есть Home
экран и несколько экранов шагов ( Step1
, Step2
, Step3
, Step4
)
Главный экран — это виджет с отслеживанием состояния и показывает количество выполненных шагов.
Поток похож
Главная => Шаг1 => Шаг2 => Шаг3 => Шаг4
На любом шаге, при нажатии кнопки «Назад» или «Закрыть», он должен вернуться на Home
экран, а на главном экране должно отображаться обновленное состояние выполненных шагов. Итак, я перехожу к следующим шагам на экране шагов, используя, Navigator.popAndPushNamed
чтобы Navigator.pop
перейти к Home
экрану.
И используя Navigator.pushNamed(context, 'Step1').then
in Home
screen для его обновления. Но проблема в том, что .then
вызывается только Step1
само по себе, потому что оно выскочило, и если пользователь переходит к
Главная страница => Шаг1 => Шаг2 => Шаг3 => Главная страница (с использованием pop)
Домашний экран покажет только, что Шаг 1 завершен, потому что при переходе из Step1 to Step2
был вызван его .then
обратный вызов, а при переходе к Home
из Step3
использования Navigator.pop
код не выполняется, и я не могу обновить домашний экран. Я знаю, что могу использовать Navigator.pushNamed(context, 'Home')
из шагов, чтобы перейти к главному экрану, но это выглядит не нормально (похоже, что на него был нажат главный экран, вместо этого анимация должна быть такой, как будто она возвращается).
Ответ №1:
Вы можете использовать переменную на вашей предыдущей странице, которая будет отслеживать, переходите ли вы со следующей страницы, и возвращать логическую переменную true, указывая, что она вернулась из предыдущего действия. Вы можете использовать эту переменную в своем методе инициализации, и если значение этой переменной равно true, вы можете просто запустить событие, которое вернет соответствующее состояние.
Комментарии:
1. как мне вернуть переменную? и точно, мне нужно какое-то место, где я могу выполнить код, когда он вернется на этот экран, и initState не вызывается снова, когда я возвращаюсь к экрану после
Navigator.pop
(я не знаю, есть ли какой-либо метод, который вызывается)2. Это пример возврата данных из pop. flutter.dev/docs/ cookbook/navigation/returning-data
3. да, но дело в том, что вы можете возвращать переменную только со следующего экрана, и обратный вызов для обработки возвращаемого значения выполняется немедленно, когда появляется следующий экран, что не обязательно означает, что вы находитесь на предыдущем экране, например, я включен
ScreenA
, перешел кScreenB
использованиюNavigator.pushNamed(context, 'ScreenB').then((value) { debugPrint('screen is poped from screenA'); })
и изScreenB
перешел кScreenC
использованиюNavigator.popAndPushNamed(context, 'ScreenC')
, поэтому здесь он печатаетсяscreen is poped from screenA
, даже если мы находимся наScreenC
Ответ №2:
нашел решение с помощью RouteObserver
и реализовал что-то вроде примера, приведенного вhttps://api.flutter.dev/flutter/widgets/RouteObserver-class.html
Метод, который я искал didPopNext
в RouteAware.
Ответ №3:
Проверьте это, у меня это работает!
Navigator.of(context).push(route).then((val){ //you can update you data here, when coming back })
Комментарии:
1. как я уже говорил в вопросе, в этом случае обратный вызов
.then
вызывается сразу послеroute
извлечения из навигатора, и это не означает, что он вернулся к предыдущему экрану. Потому что с другого экрана я делаюpopAndPush
, который заменяет текущий экран другим экраном.