PiN73 / cupertino_back_gesture

Flutter package to set custom width of iOS back swipe gesture area
BSD 3-Clause "New" or "Revised" License
30 stars 17 forks source link

extends MaterialPageRoute does not work #14

Closed yaooort closed 3 years ago

yaooort commented 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})';
}
PiN73 commented 3 years ago

Please clarify what are you trying to achieve

yaooort commented 3 years ago

ty