Я создаю раздел регистрации в моем приложении, используя Flutter, и пытаюсь сделать следующее:
Пользователь нажимает кнопку Зарегистрироваться
Пользователь нажимает кнопку возврата на любом этапе во время регистрации
Затем появляется диалоговое окно с вопросом, действительно ли пользователь хочет оставить знакпроцесс
Пользователь нажимает Да
Затем пользователь возвращается на первую (главную) страницуприложения.
Это работает для первой страницы после того, как я нажимаю на кнопку регистрации, но когда я попадаю на вторую страницу, шаг 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();
},
)
],
);
});
}
Надеюсь, я хорошо это объяснил.