Flutter Красиво выходит из системы и заменяет стек

#flutter

#flutter

Вопрос:

На произвольной глубине в приложении my Flutter пользователь может выйти из приложения, нажав на кнопку. Как я могу заменить текущий стек экранов экраном авторизации / входа в систему и создать «красивую» анимацию для перехода?

В настоящее время я делаю следующее, но анимация совсем не красивая. В iOS экраны в стеке выдвигаются вправо, а экран авторизации перемещается справа. Слишком сильное скольжение.

 NavigatorState navigatorState = Navigator.of(this.context);
while (navigatorState.canPop()) {
  navigatorState.pop();
}

Navigator.pushReplacement(
  context,
  MaterialPageRoute(builder: (BuildContext context) {
    return AuthScreen();
  }),
);
  

Я бы предпочел, чтобы экран авторизации скользил снизу вверх на iOS, а на Android экран авторизации отображался с обычной анимацией. Затем удалите все экраны, расположенные ниже в стеке. Я не могу найти способ манипулировать стеком таким образом во Flutter.

Ответ №1:

попробуйте это.

   Navigator.pushAndRemoveUntil(
      context,
      PageRouteBuilder(pageBuilder: (BuildContext context, Animation animation,
          Animation secondaryAnimation) {
        return AuthScreen();
      }, transitionsBuilder: (BuildContext context, Animation<double> animation,
          Animation<double> secondaryAnimation, Widget child) {
        return new SlideTransition(
          position: new Tween<Offset>(
            begin: const Offset(1.0, 0.0),
            end: Offset.zero,
          ).animate(animation),
          child: child,
        );
      }),
      (Route route) => false);
  

Здесь pushAndRemoveUntil очистится стек и появится новый экран.

PageRouteBuilder Позволяет анимировать переходы на экране. Вы можете поиграть с ним, вернувшись FadeTransition или любым другим, который вам больше нравится. Таким образом, вы можете добиться анимированного перехода.

Ответ №2:

Если вы объявляете маршруты в своем MaterialApp подобным образом.

 MaterialApp(
  home: new Screen1(),
  routes: <String, WidgetBuilder> {
    '/AuthScreen': (BuildContext context) => new AuthScreen()
  },
)
  

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

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

Источник информации

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

1. хороший ответ! не могли бы вы также, пожалуйста, объяснить, для чего нужен этот аргумент? (Маршрут<динамический> маршрут) => false