Как установить разные анимации перехода на Navigator.pop () в Flutter, в соответствии с действиями пользователя?

#flutter

#flutter

Вопрос:

В моем проекте Flutter, который имеет несколько экранов, я хочу создать один экран с 2 кнопками:

  • первая кнопка закрывает текущий экран Navigator.pop() с переходом, при котором текущий экран исчезает справа
  • вторая кнопка также закрывает текущий экран Navigator.pop() , но на этот раз экран исчезает в нижней части

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

Кроме того, я использую именованные маршруты для навигации в своем приложении.

Как я могу настроить анимацию всплывающих окон в соответствии с кнопкой, нажатой пользователем?

Спасибо.

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

1. Вы можете использовать pageRouteBuilder для пользовательских анимаций навигации. Посмотрите эту статью и это видео .

2. Я уже все это проверил, и, к сожалению, это не отвечает на мой вопрос: как выбрать 2 разных анимации перехода в Navigator.pop() зависимости от нажатой кнопки?

3. вы должны использовать пользовательский Navigator интерфейс с пользовательским TransitionDelegate интерфейсом, который может принимать параметры при всплывающем окне и решать, какой переход использовать

Ответ №1:

что бы вы ни определили как анимацию маршрута, оно будет обратным и будет использоваться как всплывающая навигация.
в вашем случае вы можете использовать разные анимации для нажатия каждой из них.
вы можете создать свою собственную анимацию и определить анимацию и использовать ее вместо material page router

    import 'package:flutter/material.dart';
class MyCustomRoute extends PageRouteBuilder {
  final Widget widget;
  MyCustomRoute({this.widget})
    : super(
        pageBuilder: (BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation) {
          return widget;
        },
        transitionsBuilder: (BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation, Widget child) {
          return new ScaleTransition(
            scale: new Tween<double>(
              begin: 0.0,
              end: 1.0,
            ).animate(
                CurvedAnimation(
                  parent: animation,
                  curve: Interval(
                    0.00,
                    0.50,
                    curve: Curves.bounceIn,
                  ),
                ),
              ),
            child: ScaleTransition(
                     scale: Tween<double>(
                       begin: 1.5,
                       end: 1.0,
                     ).animate(
                       CurvedAnimation(
                         parent: animation,
                         curve: Interval(
                           0.50,
                           1.00,
                           curve: Curves.easeIn,
                         ),
                       ),
                     ),
                     child: child,
                   ),
           );
         }
      );
}
 

для реализации

 onPressed: () {
  Navigator.push(context,
      new MyCustomRoute (widget: Secondpage()));
},
 

для pop

  onPressed: () {
                  Navigator.pop();// will reverse the animation
                },
 

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

1. Спасибо, но это не отвечает на мой вопрос: что, если у меня на экране есть 2 кнопки, и каждая из них устанавливает пользовательскую (и разную!) Анимацию перехода, когда я открываю экран?

2. о, вы можете использовать push вместо pop и использовать разные `анимации перехода` для каждого из них, при каждом нажатии вы можете вернуться на предыдущую страницу ,

3. также, если вы не хотите возвращаться туда, где существуют кнопки, вы можете использовать PushAndRemoveUntil вместо push этого Navigator.pushAndRemoveUntil(context,MyCustomRoute ( widget:SeconPage()),(Route<dynamic> route) => false, );

4. О, хорошо, я этого не знал, я попробую это очень скоро. Спасибо! Но еще один вопрос: если я использую push() вместо pop() , чтобы вернуться на предыдущую страницу, будет ли у меня тогда другой экземпляр этой страницы?

5. да, но вы можете использовать pushReplacement , он заменяет текущий маршрут навигатора, нажимая на данный маршрут, а затем удаляя предыдущий маршрут, как только новый маршрут закончил анимацию. вроде как pushandremoveuntil , попробуйте это и сообщите мне результат, я рад помочь