getScrollControllerOffset function

double getScrollControllerOffset({
  1. required double dx,
  2. required double dy,
  3. required Offset delta,
  4. required Offset offset,
  5. required Offset scroll,
  6. required Size itemSize,
  7. required Size viewSize,
  8. required Axis direction,
  9. required ScrollPhysics physics,
  10. required ScrollController scrollController,
})

Computing scrolling

Implementation

double getScrollControllerOffset({
  required double dx,
  required double dy,
  required Offset delta,
  required Offset offset,
  required Offset scroll,
  required Size itemSize,
  required Size viewSize,
  required Axis direction,
  required ScrollPhysics physics,
  required ScrollController scrollController,
}) {
  if (physics == const NeverScrollableScrollPhysics()) {
    return 0.0;
  }

  final tx = dx + scroll.dx;
  final ty = dy + scroll.dy;
  final left = tx - offset.dx - itemSize.width / 2 - 16.0;
  final top = ty - offset.dy - itemSize.height / 2 - 16.0;

  final inx1 = left > scroll.dx;
  final iny1 = top > scroll.dy;
  final inx2 = left + itemSize.width < viewSize.width;
  final iny2 = top + itemSize.height < viewSize.height;
  final scrollExtent = scrollController.position.maxScrollExtent;
  final scollOffset = scrollController.offset;

  if (direction == Axis.vertical) {
    if (!iny1 && scollOffset > 0 && delta.dy <= 0) {
      return -min(scollOffset, 5.0);
    }

    if (!iny2 && scollOffset < scrollExtent && delta.dy >= 0) {
      return min(scrollExtent - scollOffset, 5.0);
    }
  }

  if (direction == Axis.horizontal) {
    if (!inx1 && scollOffset > 0 && delta.dx <= 0) {
      return -min(scollOffset, 5.0);
    }

    if (!inx2 && scollOffset < scrollExtent && delta.dx >= 0) {
      return min(scrollExtent - scollOffset, 5.0);
    }
  }

  return 0.0;
}