ensureVisibleOffset method

Future<void> ensureVisibleOffset(
  1. RenderObject object, {
  2. double alignment = 0.0,
  3. Duration duration = Duration.zero,
  4. Curve curve = Curves.ease,
  5. ScrollPositionAlignmentPolicy alignmentPolicy = ScrollPositionAlignmentPolicy.explicit,
  6. RenderObject? targetRenderObject,
  7. double offset = 0.0,
})

Copy of the regular ensureVisible but with an offset parameter for more hand precision scrolling.

Implementation

Future<void> ensureVisibleOffset(
  RenderObject object, {
  double alignment = 0.0,
  Duration duration = Duration.zero,
  Curve curve = Curves.ease,
  ScrollPositionAlignmentPolicy alignmentPolicy =
      ScrollPositionAlignmentPolicy.explicit,
  RenderObject? targetRenderObject,
  double offset = 0.0,
}) {
  assert(object.attached);
  final RenderAbstractViewport viewport = RenderAbstractViewport.of(object)!;

  Rect? targetRect;
  if (targetRenderObject != null && targetRenderObject != object) {
    targetRect = MatrixUtils.transformRect(
      targetRenderObject.getTransformTo(object),
      object.paintBounds.intersect(targetRenderObject.paintBounds),
    );
  }

  double target;
  switch (alignmentPolicy) {
    case ScrollPositionAlignmentPolicy.explicit:
      target = (viewport
                  .getOffsetToReveal(object, alignment, rect: targetRect)
                  .offset +
              offset)
          .clamp(minScrollExtent, maxScrollExtent);
      break;
    case ScrollPositionAlignmentPolicy.keepVisibleAtEnd:
      target =
          (viewport.getOffsetToReveal(object, 1.0, rect: targetRect).offset +
                  offset)
              .clamp(minScrollExtent, maxScrollExtent);
      if (target < pixels) {
        target = pixels;
      }
      break;
    case ScrollPositionAlignmentPolicy.keepVisibleAtStart:
      target =
          (viewport.getOffsetToReveal(object, 0.0, rect: targetRect).offset +
                  offset)
              .clamp(minScrollExtent, maxScrollExtent);
      if (target > pixels) {
        target = pixels;
      }
      break;
  }

  if (target == pixels) return Future<void>.value();

  if (duration == Duration.zero) {
    jumpTo(target);
    return Future<void>.value();
  }

  return animateTo(target, duration: duration, curve: curve);
}