Closed yaooort closed 3 years ago
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})'; }
Please clarify what are you trying to achieve
ty