Как обновить экран или состояние при возврате к маршруту с помощью pop

#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 , который заменяет текущий экран другим экраном.