ensureVisibleOffset method
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,
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);
}