getScrollControllerOffset function
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,
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;
}