class AnimationPageRoute<T> extends MaterialPageRoute<T> {
AnimationPageRoute({
WidgetBuilder builder,
RouteSettings settings,
this.isExitPageAffectedOrNot = true,
this.animationType = AnimationType.SlideRL,
this.maintainState = true,
}) : super(builder: builder, settings: settings);
// AnimationPageRoute({
// @required this.builder,
// this.isExitPageAffectedOrNot = true,
// this.animationType = AnimationType.SlideRL,
// RouteSettings settings,
// this.maintainState = true,
// bool fullscreenDialog = false,
// }) : assert(builder != null),
// assert(isExitPageAffectedOrNot != null),
// assert(animationType != null),
// assert(maintainState != null),
// assert(fullscreenDialog != null);
// final WidgetBuilder builder;
/// 该参数只针对当[AnimationType]为[SlideLR]或[SlideRL]新页面及当前页面动画均有效
final bool isExitPageAffectedOrNot;
final AnimationType animationType;
@override
final bool maintainState;
@override
Duration get transitionDuration => const Duration(milliseconds: 1000);
@override
Color get barrierColor => null;
@override
String get barrierLabel => null;
@override
bool canTransitionTo(TransitionRoute<dynamic> nextRoute) =>
nextRoute is AnimationPageRoute && !nextRoute.fullscreenDialog;
@override
Widget buildPage(BuildContext context, Animation<double> animation,
Animation<double> secondaryAnimation) {
final Widget result = builder(context);
assert(() {
if (result == null) {
throw FlutterError.fromParts(<DiagnosticsNode>[
ErrorSummary(
'The builder for route "${settings.name}" returned null.'),
ErrorDescription('Route builders must never return null.')
]);
}
return true;
}());
return Semantics(
scopesRoute: true, explicitChildNodes: true, child: result);
}
@override
Widget buildTransitions(BuildContext context, Animation<double> animation,
Animation<double> secondaryAnimation, Widget child) {
if (animationType == AnimationType.Fade)
FadeTransition(
opacity: CurvedAnimation(
parent: animation,
curve: Curves.linearToEaseOut,
reverseCurve: Curves.easeInToLinear,
).drive(_tweenFade),
child: child);
final TextDirection textDirection = Directionality.of(context);
Tween<Offset> primaryTween = _primaryTweenSlideFromRightToLeft,
secondTween = _secondaryTweenSlideFromRightToLeft;
Cubic curve = Curves.linearToEaseOut, reverseCurve = Curves.easeInToLinear;
if (animationType == AnimationType.SlideBT) {
primaryTween = _primaryTweenSlideFromBottomToTop;
} else if (animationType == AnimationType.SlideTB) {
primaryTween = _primaryTweenSlideFromTopToBottom;
} else if (animationType == AnimationType.SlideLR) {
primaryTween = _primaryTweenSlideFromLeftToRight;
secondTween = _secondaryTweenSlideFromLeftToRight;
curve = Curves.fastOutSlowIn;
reverseCurve = Curves.easeOutCubic;
}
Widget enterAnimWidget = SlideTransition(
position: CurvedAnimation(
parent: animation,
curve: curve,
reverseCurve: reverseCurve,
).drive(primaryTween),
textDirection: textDirection,
child: child);
if (isExitPageAffectedOrNot != true ||
([AnimationType.SlideTB, AnimationType.SlideBT]
.contains(animationType))) return enterAnimWidget;
return SlideTransition(
position: CurvedAnimation(
parent: secondaryAnimation,
curve: curve,
reverseCurve: reverseCurve,
).drive(secondTween),
textDirection: textDirection,
child: enterAnimWidget);
}
@override
String get debugLabel => '${super.debugLabel}(${settings.name})';
}