callViewportBuilder method

void callViewportBuilder({
  1. ViewportBuilder? viewportBuilder,
  2. PaintExtentOf? getPaintExtend,
  3. double mainAxisSpacing = 0,
})

call ViewportBuilder if it's not null

Implementation

void callViewportBuilder({
  ViewportBuilder? viewportBuilder,
  //ExtentList and GridView can't use paintExtentOf
  PaintExtentOf? getPaintExtend,
  double mainAxisSpacing = 0,
}) {
  if (viewportBuilder == null) {
    return;
  }

  /// it's not go into viewport
  if (firstChild == null ||
      //sometime, remainingPaintExtent is not zero though sliver is not go into viewport
      //maybe this is issue for viewport
      (constraints.precedingScrollExtent != 0.0 &&
          constraints.remainingPaintExtent == 0)) {
    return;
  }

  int viewportFirstIndex = -1;
  int viewportLastIndex = -1;
  RenderBox? viewportFirstChild = firstChild;
  while (true) {
    final double layoutOffset = childScrollOffset(viewportFirstChild!)!;
    final double trailingOffset = layoutOffset +
        (getPaintExtend != null
            ? getPaintExtend(viewportFirstChild)
            : paintExtentOf(viewportFirstChild));
    if (layoutOffset - (layoutOffset == 0 ? 0 : mainAxisSpacing) <=
            constraints.scrollOffset &&
        constraints.scrollOffset < trailingOffset) {
      viewportFirstIndex = indexOf(viewportFirstChild);
      break;
    }
    viewportFirstChild = childAfter(viewportFirstChild);
    if (viewportFirstChild == null) {
      break;
    }
  }

  RenderBox? viewportLastChild = lastChild;

  while (true) {
    final double layoutOffset = childScrollOffset(viewportLastChild!)!;
    final double trailingOffset = layoutOffset +
        (getPaintExtend != null
            ? getPaintExtend(viewportLastChild)
            : paintExtentOf(viewportLastChild));
    if (layoutOffset <
            constraints.scrollOffset + constraints.remainingPaintExtent &&
        trailingOffset >= constraints.scrollOffset) {
      viewportLastIndex = indexOf(viewportLastChild);
      break;
    }
    viewportLastChild = childBefore(viewportLastChild);
    if (viewportLastChild == null) {
      break;
    }
  }

  viewportBuilder(viewportFirstIndex, viewportLastIndex);
}