Как использовать PageTransitionsBuilder при переходе на другой экран? - PullRequest
0 голосов
/ 30 мая 2020
final builder = OpenUpwardsPageTransitionsBuilder();

Navigator.push(
  context,
  PageRouteBuilder(
    pageBuilder: (_, __, ___) => Page2(),
    transitionsBuilder: builder, // error
  ),
);

Насколько я понимаю, я могу установить PageTransitionsBuilder только внутри Theme, есть ли способ использовать его внутри Navigator?

Ответы [ 2 ]

2 голосов
/ 31 мая 2020

Самым простым решением является пользовательский PageRouteBuilder:

class MyPageRouteBuilder<T> extends PageRouteBuilder<T> {
  final PageTransitionsBuilder pageTransitionsBuilder;

  MyPageRouteBuilder({
    @required RoutePageBuilder pageBuilder,
    @required this.pageTransitionsBuilder,
  }) : assert(pageTransitionsBuilder != null), super(pageBuilder: pageBuilder);

  @override
  Widget buildTransitions(BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation, Widget child) {
    return pageTransitionsBuilder.buildTransitions(this, context, animation, secondaryAnimation, child);
  }
}

Здесь только pageBuilder передается в super(), но вы можете добавить любой именованный параметр, который принимает PageRouteBuilder (например, transitionDuration например)

Теперь вы можете использовать его с:

Navigator.of(context).push(
  MyPageRouteBuilder(
    pageBuilder: (ctx, a1, a2) => Page2(),
    pageTransitionsBuilder: OpenUpwardsPageTransitionsBuilder(),
  )
);
0 голосов
/ 30 мая 2020
Navigator.push(
  context,
  PageRouteBuilder(
    pageBuilder: (ctx, a1, a2) => Screen2(),
    transitionsBuilder: (ctx, anim, a2, child) => FadeTransition(opacity: anim, child: child),
    transitionDuration: Duration(milliseconds: 3000),
  ),
);

Вы можете изменить время в миллисекундах в соответствии с вашими потребностями в приложении.

...