callViewportBuilder method
void
callViewportBuilder({
- ViewportBuilder? viewportBuilder,
- PaintExtentOf? getPaintExtend,
- 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);
}