Navigation.pop () и Navigation.push () ведут себя странно - PullRequest
0 голосов
/ 20 октября 2019

Я создаю раздел регистрации в моем приложении, используя Flutter, и пытаюсь сделать следующее:

  1. Пользователь нажимает кнопку Зарегистрироваться

  2. Пользователь нажимает кнопку возврата на любом этапе во время регистрации

  3. Затем появляется диалоговое окно с вопросом, действительно ли пользователь хочет оставить знакпроцесс

  4. Пользователь нажимает Да

  5. Затем пользователь возвращается на первую (главную) страницуприложения.

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

После некоторой отладки я обнаружил проблему, но я не знаю, почему это происходит.

Я написал проблему как комментарий во второмфрагмент кода, в конце функции onBackPressed(), чтобы было ясно, где он ломается:).

Вот мой код для перехода на страницу процесса регистрации из моего main.dart:

Navigator.push(
    context,
    MaterialPageRoute(builder: (context) => SignUp())
)

Затем для каждой страницы в процессе регистрации, когда я перехожу на следующую страницу, я делаю Navigation.pop(context) до pop текущую регистрациювыпустите страницу из стека и сделайте Navigation.push() сразу после нажатия следующей страницы.

Вот код функции кнопки «Назад» на каждой странице регистрации:

bool backIsPressed = false;
Tools _tools = new Tools();

@override
void initState() {
  super.initState();
  BackButtonInterceptor.add(onBackPressed);
}

@override
void dispose() {
  BackButtonInterceptor.remove(onBackPressed);
  super.dispose();
}

bool onBackPressed(bool stopDefaultButtonEvent) {
  this.backIsPressed = !backIsPressed;

  if(backIsPressed) {
    _tools.yesNoAlert(
      context,
      "Going Back?",
      "Are you sure you want back? Changes made will not be saved.",
          () {
        this.backIsPressed = false;
        Navigator.pop(context, true);
      },
          () {
        this.backIsPressed = false;
        Navigator.pop(context, false);
      },
    ).then((res) {
      // ---------------- BREAKS HERE -----------------
      // "res" returns null the first time YES is pressed
      // But Navigation.pop(context, true) should return true according to Flutter's docs
      if(res) {
        Navigator.pop(context);
      }
    });

  }
  else {
    Navigator.pop(context);
  }

  return true;
}

И наконец, функция yesOrNoAlert() в классе Tools.

Future<bool> yesNoAlert(BuildContext context, String title,
    String description, Function yesFunction, Function noFunction) {
  this._isDialogOpen = true;
  return showDialog(
      context: context,
      barrierDismissible: false,
      builder: (BuildContext context) {
        return AlertDialog(
          title: new Text(title),
          content: new Text(description),
          actions: <Widget>[
            new FlatButton(
              child: new Text('Yes'),
              onPressed: () {
                _isDialogOpen = false;
                yesFunction();
              },
            ),
            new FlatButton(
              child: new Text('No'),
              onPressed: () {
                _isDialogOpen = false;
                noFunction();
              },
            )
          ],
        );
      });
}

Надеюсь, я хорошо это объяснил.

1 Ответ

1 голос
/ 20 октября 2019

если вы хотите вернуться на первую страницу, вместо pop (), вы можете использовать popUntil (), когда пользователь выбирает yes ... no, необходимо передавать «res»

Подробнее об этомздесь: https://api.flutter.dev/flutter/widgets/Navigator/popUntil.html

...