Flutter: переход на новый экран без возврата

Я реализую поток аутентификации в своем приложении 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, но он, похоже, не работал.

Ответ 1

При выходе из экрана авторизации необходимо использовать Navigator.pushReplacement. Не только при перенаправлении на страницу входа.

Ответ 2

Вы должны использовать

Navigator
    .of(_context)
    .pushReplacement(new MaterialPageRoute(builder: (BuildContext context) => page));

Где _context - объект BuildContext И page - это страница, на которую вы BuildContext.

Ответ 3

Вы можете использовать метод pushAndRemoveUntil:

Протолкните заданный маршрут в навигатор, который наиболее точно охватывает заданный контекст, а затем удалите все предыдущие маршруты, пока predicate вернет истину. Чтобы удалить все маршруты ниже проталкиваемого маршрута, используйте [RoutePredicate], который всегда возвращает false (например, (Route<dynamic> route) => false).

Navigator.pushAndRemoveUntil(
  context,
  MaterialPageRoute(builder: (context) => MainPage()),
  (Route<dynamic> route) => false,
);