import 'package:animations/animations.dart'; import 'package:flutter/material.dart'; typedef PageBuilder = Widget Function(); class PageRoutes { static const double kDefaultDuration = .35; static const Curve kDefaultEaseFwd = Curves.easeOut; static const Curve kDefaultEaseReverse = Curves.easeOut; static Route fade(PageBuilder pageBuilder, [double duration = kDefaultDuration]) { return PageRouteBuilder( transitionDuration: Duration(milliseconds: (duration * 1000).round()), pageBuilder: (context, animation, secondaryAnimation) => pageBuilder(), transitionsBuilder: (context, animation, secondaryAnimation, child) { return FadeTransition(opacity: animation, child: child); }, ); } static Route fadeThrough(PageBuilder pageBuilder, [double duration = kDefaultDuration]) { return PageRouteBuilder( transitionDuration: Duration(milliseconds: (duration * 1000).round()), pageBuilder: (context, animation, secondaryAnimation) => pageBuilder(), transitionsBuilder: (context, animation, secondaryAnimation, child) { return FadeThroughTransition( animation: animation, secondaryAnimation: secondaryAnimation, child: child); }, ); } static Route fadeScale(PageBuilder pageBuilder, [double duration = kDefaultDuration]) { return PageRouteBuilder( transitionDuration: Duration(milliseconds: (duration * 1000).round()), pageBuilder: (context, animation, secondaryAnimation) => pageBuilder(), transitionsBuilder: (context, animation, secondaryAnimation, child) { return FadeScaleTransition(animation: animation, child: child); }, ); } static Route sharedAxis(PageBuilder pageBuilder, [SharedAxisTransitionType type = SharedAxisTransitionType.scaled, double duration = kDefaultDuration]) { return PageRouteBuilder( transitionDuration: Duration(milliseconds: (duration * 1000).round()), pageBuilder: (context, animation, secondaryAnimation) => pageBuilder(), transitionsBuilder: (context, animation, secondaryAnimation, child) { return SharedAxisTransition( child: child, animation: animation, secondaryAnimation: secondaryAnimation, transitionType: type, ); }, ); } static Route slide(PageBuilder pageBuilder, {double duration = kDefaultDuration, Offset startOffset = const Offset(1, 0), Curve easeFwd = kDefaultEaseFwd, Curve easeReverse = kDefaultEaseReverse}) { return PageRouteBuilder( transitionDuration: Duration(milliseconds: (duration * 1000).round()), pageBuilder: (context, animation, secondaryAnimation) => pageBuilder(), transitionsBuilder: (context, animation, secondaryAnimation, child) { bool reverse = animation.status == AnimationStatus.reverse; return SlideTransition( position: Tween(begin: startOffset, end: const Offset(0, 0)) .animate(CurvedAnimation( parent: animation, curve: reverse ? easeReverse : easeFwd)), child: child, ); }, ); } }