dragEnd method

void dragEnd(
  1. double velocity
)

The drag gesture has ended with a horizontal motion of fractionalVelocity as a fraction of screen width per second.

Implementation

void dragEnd(double velocity) {
  // Fling in the appropriate direction.
  // AnimationController.fling is guaranteed to
  // take at least one frame.
  //
  // This curve has been determined through rigorously eyeballing native iOS
  // animations.
  const Curve animationCurve = Curves.fastLinearToSlowEaseIn;
  final bool animateForward;

  // If the user releases the page before mid screen with sufficient velocity,
  // or after mid screen, we should animate the page out. Otherwise, the page
  // should be animated back in.
  if (velocity.abs() >= _kMinFlingVelocity) {
    animateForward = velocity <= 0;
  } else {
    animateForward = controller.value > 0.5;
  }

  if (animateForward) {
    // The closer the panel is to dismissing, the shorter the animation is.
    // We want to cap the animation time, but we want to use a linear curve
    // to determine it.
    final droppedPageForwardAnimationTime = min(
      lerpDouble(
              _kMaxDroppedSwipePageForwardAnimationTime, 0, controller.value)!
          .floor(),
      _kMaxPageBackAnimationTime,
    );
    controller.animateTo(1.0,
        duration: Duration(milliseconds: droppedPageForwardAnimationTime),
        curve: animationCurve);
  } else {
    // This route is destined to pop at this point. Reuse navigator's pop.
    navigator.pop();

    // The popping may have finished inline if already at the
    // target destination.
    if (controller.isAnimating) {
      // Otherwise, use a custom popping animation duration and curve.
      final droppedPageBackAnimationTime = lerpDouble(
              0, _kMaxDroppedSwipePageForwardAnimationTime, controller.value)!
          .floor();
      controller.animateBack(0.0,
          duration: Duration(milliseconds: droppedPageBackAnimationTime),
          curve: animationCurve);
    }
  }

  if (controller.isAnimating) {
    // Keep the userGestureInProgress in true state so we don't change the
    // curve of the page transition mid-flight since CupertinoPageTransition
    // depends on userGestureInProgress.
    late AnimationStatusListener animationStatusCallback;
    animationStatusCallback = (status) {
      navigator.didStopUserGesture();
      controller.removeStatusListener(animationStatusCallback);
    };
    controller.addStatusListener(animationStatusCallback);
  } else {
    navigator.didStopUserGesture();
  }
}