Как обрабатывать кнопку возврата Android в flutter

#flutter

#flutter

Вопрос:

Я перехожу с одной страницы на другую страницу, например, с кнопки, которая находится на странице

 1st Page <---> 2nd Page <--->  3rd Page <--->   4th Page
  

Если я нахожусь на любой странице после нажатия кнопки возврата Android, я хочу перейти на главную страницу вместо перехода на предыдущую страницу.

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

 Future<bool> pushPage(BuildContext context) {
// return   Navigator.of(context).pop(true);
  return Navigator.of(context).pushNamedAndRemoveUntil('/quiz2', 
 ModalRoute.withName("/landingPage"));
}
 class _Quiz1State extends State<Quiz1> {
bool hasSolved = false;
int solvedOption = 0;
@override
Widget build(BuildContext context) {
return WillPopScope(
  onWillPop: () async {
    pushPage(context);
    return false;
  },
      child: Scaffold(
    body: Stack(
        alignment: Alignment.topCenter,
        children: [
          Container(
    decoration: BoxDecoration(
      gradient: LinearGradient(
        begin: Alignment.bottomCenter,
        end: Alignment.topCenter,
        colors: [
          Color(0xffBD00FF),
          Color(0xffF1509E),
        ],
      ),
    ),
          ),
          mainQuiz(),
          Container(
    child: uiElements(context),
    margin: EdgeInsets.only(top: 16),
          ),
        ],
      ),
  ),
);
}
  

функция mainquiz () — это функция 2-й страницы

Комментарии:

1. Я не буду использовать WillPopScope в качестве родителя, я вызову Navigator, чтобы вернуться на эту страницу. И я буду использовать этот метод pushAndRemoveUntil<T расширяет объект?> метод api.flutter.dev/flutter/widgets/Navigator-class.html Надеюсь, это вам поможет.

2. можете ли вы объяснить мне простой пример в моем коде

Ответ №1:

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

Для этого сначала (если вы еще этого не сделали) вам нужно присвоить имена всем вашим страницам. Они будут действовать как идентификационная карточка для страницы, когда вы ссылаетесь на них в своих функциях. Для этого в самой верхней части вашего дерева, где находится виджет MaterialApp, сделайте так :

 MaterialApp(
  home: new Screen1(),
  routes: <String, WidgetBuilder> {
    '/screen1': (BuildContext context) => new Screen1(),
    '/screen2' : (BuildContext context) => new Screen2(),
    '/screen3' : (BuildContext context) => new Screen3(),
    '/screen4' : (BuildContext context) => new Screen4()
  },
)
  

В основном, что вы здесь делаете, вы предварительно определяете имена для всех маршрутов, которые вы будете использовать в своем приложении.
Теперь скажем, что навигация в приведенном выше примере работает следующим образом :

Screen1 -> Screen2 -> Screen3 -> Screen4

Теперь скажем, что я нахожусь на Screen4 () ….. тогда мой текущий стек будет [Screen4, Screen3, Screen2, Screen1] ….. (последний первый, самый старый последний), и при нажатии кнопки «Назад» мне нужно напрямую перейти к Screen1 ()…. (Домашняя страница в вашем случае). Тогда вместо простого Navtigator.pop() Я сделаю что-то вроде этого :

 Navigator.popUntil(context, ModalRoute.withName('/screen1'));
  

Это будет продолжать выводить виджеты, пока не достигнет screen1.
Надеюсь, это решит вашу проблему.

ПРИМЕЧАНИЕ:

После того, как вы предварительно определили все свои маршруты в начале, вместо вызова Navigator.push(context,MaterialPageRoute((context) => Screen1());

Вы можете сделать это : Navigator.pushNamed(context, '/screen1');

Редактировать: скажем, если ваша домашняя страница еще не присутствовала в стеке, и вы хотите показать ее после появления всех экранов. Вы можете сделать :

Navigator.of(context).pushNamedAndRemoveUntil('/homepage', (Route<dynamic> route) => false);

Это добавит домашнюю страницу () после удаления всех других экранов, присутствующих в стеке. [» (Route route) => false » выведет все экраны из стека. ]. Затем, если вы хотите выводить экран только до тех пор, пока не будет достигнут заданный экран (скажем, пока мы не достигнем screen1), вы можете сделать что-то вроде:

Navigator.of(context).pushNamedAndRemoveUntil('/homepage','/screen1');

Ответ №2:

После 1-й страницы используйте Navigator.pushReplacement вместо Navigator.push

Вы также можете использовать это для перехода на первую страницу:

 Navigator.of(context).popUntil((route) => route.isFirst);
  

Комментарии:

1. если я использую Navigator.pushReplacement вместо Navigator.push, смогу ли я вернуться после нажатия кнопки, которая находится на странице, чтобы вернуться

2. когда вы используете pushReplacement, новое состояние заменяет текущее состояние, а текущее состояние удаляется. итак, когда вы нажимаете кнопку возврата (физическую или программную), вы возвращаетесь в первое состояние.