animateToScroll method

void animateToScroll(
  1. double scrollDelta,
  2. double scrollSpeed
)

Implementation

void animateToScroll(
  double scrollDelta,
  double scrollSpeed,
) {
  if (scrollDelta > 0 != prevDeltaPositive) {
    prevDeltaPositive = !prevDeltaPositive;
    futurePosition =
        clientController.offset + (scrollDelta * scrollSpeed * 0.5);
  } else {
    futurePosition = futurePosition + (scrollDelta * scrollSpeed * 0.5);
  }

  final Duration duration;
  if (futurePosition > clientController.position.maxScrollExtent) {
    futurePosition = isPlatformBouncingScrollPhysics
        ? min(clientController.position.maxScrollExtent + 150, futurePosition)
        : clientController.position.maxScrollExtent;
    duration =
        Duration(milliseconds: silkyScrollDuration.inMilliseconds ~/ 2);
  } else if (futurePosition < clientController.position.minScrollExtent) {
    futurePosition = isPlatformBouncingScrollPhysics
        ? max(clientController.position.minScrollExtent - 150, futurePosition)
        : clientController.position.minScrollExtent;
    duration =
        Duration(milliseconds: silkyScrollDuration.inMilliseconds ~/ 2);
  } else {
    duration = silkyScrollDuration;
  }
  isOnSilkyScrolling = true;
  final Future<void> animationEnd =
      _animationEnd = clientController.animateTo(
    futurePosition,
    duration: duration,
    curve: animationCurve,
  );
  animationEnd.whenComplete(() {
    if (animationEnd == _animationEnd) {
      isOnSilkyScrolling = false;
      if (clientController.hasClients == false) {
        return;
      }

      double edgePosition = 0;
      if (clientController.offset >
          clientController.position.maxScrollExtent) {
        isRecoilScroll = true;
        edgePosition = clientController.position.maxScrollExtent;
      } else if (clientController.offset <
          clientController.position.minScrollExtent) {
        isRecoilScroll = true;
        edgePosition = clientController.position.minScrollExtent;
      }

      if (isRecoilScroll) {
        notifyListeners();
        clientController
            .animateTo(
          edgePosition,
          duration: Duration(milliseconds: recoilDurationMS),
          curve: Curves.easeInOutSine,
        )
            .whenComplete(() {
          if (isAlive) {
            isRecoilScroll = false;
            notifyListeners();
          }
        });
      }
    }
  });
}