Ответ 1
При выходе из экрана авторизации необходимо использовать Navigator.pushReplacement
. Не только при перенаправлении на страницу входа.
Я реализую поток аутентификации в своем приложении Flutter.
После попытки входа в систему CheckAuth (который проверяет, был ли пользователь подписан или нет, а затем открывает домашний экран или соответствующий экран) открывается с помощью этого кода:
void _signIn() async {
await _auth
.signInWithEmailAndPassword(
email: _userEmail.trim(), password: _userPassword.trim())
.then((task) {
// go to home screen
if (task.getIdToken() != null) {
setState(() {
Navigator.pushReplacement(
context,
new MaterialPageRoute(
builder: (BuildContext context) => new CheckAuth()));
});
} else {
print("Authentication failed");
}
});
}
Проблема. Я могу успешно войти в приложение, но если я нажму кнопку "Назад" после входа в систему, она вернется к экрану входа (пока я ожидаю, что он выйдет из приложения).
Вопрос: Как переехать с одного экрана на другой в Флаттере без обратного пути?
Нужно ли мне как-то удалить историю навигатора? Или вообще не использовать навигатор? Я попробовал метод Navigator.replace, но он, похоже, не работал.
При выходе из экрана авторизации необходимо использовать Navigator.pushReplacement
. Не только при перенаправлении на страницу входа.
Вы должны использовать
Navigator
.of(_context)
.pushReplacement(new MaterialPageRoute(builder: (BuildContext context) => page));
Где _context
- объект BuildContext
И page
- это страница, на которую вы BuildContext
.
Вы можете использовать метод pushAndRemoveUntil
:
Протолкните заданный маршрут в навигатор, который наиболее точно охватывает заданный контекст, а затем удалите все предыдущие маршруты, пока
predicate
вернет истину. Чтобы удалить все маршруты ниже проталкиваемого маршрута, используйте [RoutePredicate], который всегда возвращает false (например,(Route<dynamic> route) => false
).
Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(builder: (context) => MainPage()),
(Route<dynamic> route) => false,
);