extrapolateMaxScrollOffset method

  1. @override
double extrapolateMaxScrollOffset(
  1. _PopUpList? popUpList,
  2. int firstIndex,
  3. int lastIndex,
  4. double leadingScrollOffset,
  5. double trailingScrollOffset,
  6. int childCount,
)
override

Estimates the max scroll offset based on the rendered viewport data.

Implementation

@override
double extrapolateMaxScrollOffset(
  _PopUpList? popUpList,
  int firstIndex,
  int lastIndex,
  double leadingScrollOffset,
  double trailingScrollOffset,
  int childCount,
) {
  assert(!intervalManager.hasPendingUpdates);

  if (lastIndex == childCount - 1) {
    return trailingScrollOffset;
  }

  final ilist = popUpList?.intervals ?? intervalManager.list;

  var innerCount = 0, trailingCount = 0;
  var averageInnerCount = 0.0;
  var trailingSize = 0.0;
  for (final i in ilist.expandedIntervals.whereType<_SpaceInterval>()) {
    if (i.actualBuildOffset > lastIndex) {
      trailingCount++;
      trailingSize += i.currentSize;
    } else {
      innerCount++;
      averageInnerCount += i.averageCount;
    }
  }

  var ret = trailingScrollOffset + trailingSize;

  // # items outside/after the viewport, excluding resizing intervals
  final remainingCount = childCount - lastIndex - trailingCount - 1;
  if (remainingCount > 0) {
    final averageExtent = trailingScrollOffset /
        (1 + lastIndex - innerCount + averageInnerCount);

    ret += averageExtent * remainingCount;
  }

  return ret;
}