getGeometries method
Returns the geometries of each tiles in the pattern.
Implementation
@override
SliverPatternGridGeometries getGeometries(
SliverConstraints constraints,
int crossAxisCount,
) {
final maxCrossAxisExtent = constraints.crossAxisExtent;
final List<SliverGridGeometry> geometries = List.filled(
pattern.length,
kZeroGeometry,
);
int i = 0;
double mainAxisOffset = 0;
double crossAxisOffset =
startCrossAxisDirectionReversed ? maxCrossAxisExtent : 0;
bool reversed = startCrossAxisDirectionReversed;
while (i < tileCount) {
int startIndex = i;
double crossAxisRatioSum = 0;
while (crossAxisRatioSum < 1 && i < tileCount) {
crossAxisRatioSum += pattern[i].crossAxisRatio;
i++;
}
if (crossAxisRatioSum > 1) {
// The last ratio is too high. We remove it from this track.
i--;
}
final tileBottomSpaceSum = tileBottomSpace * (i - startIndex);
final isHorizontal = constraints.axis == Axis.horizontal;
final usableCrossAxisExtent = ((startIndex == 0
? maxCrossAxisExtent
: maxCrossAxisExtent - crossAxisSpacing) -
(i - startIndex - 1) * crossAxisSpacing -
(i == tileCount ? crossAxisSpacing : 0) -
(isHorizontal ? tileBottomSpaceSum : 0))
.clamp(0, maxCrossAxisExtent);
double targetMainAxisOffset = 0;
for (int j = startIndex; j < i; j++) {
final tile = pattern[j];
final crossAxisExtent = usableCrossAxisExtent * tile.crossAxisRatio +
(isHorizontal ? tileBottomSpace : 0);
final mainAxisExtent = crossAxisExtent / tile.aspectRatio +
(isHorizontal ? 0 : tileBottomSpace);
crossAxisOffset =
reversed ? crossAxisOffset - crossAxisExtent : crossAxisOffset;
final tileRect = SliverGridGeometry(
scrollOffset: mainAxisOffset,
crossAxisOffset: crossAxisOffset,
mainAxisExtent: mainAxisExtent,
crossAxisExtent: crossAxisExtent,
);
final endMainAxisOffset = mainAxisOffset + mainAxisExtent;
crossAxisOffset = reversed
? crossAxisOffset - crossAxisSpacing
: crossAxisOffset + crossAxisExtent + crossAxisSpacing;
mainAxisOffset += mainAxisSpacing;
geometries[j] = tileRect;
if (endMainAxisOffset > targetMainAxisOffset) {
targetMainAxisOffset = endMainAxisOffset;
}
}
mainAxisOffset = targetMainAxisOffset + mainAxisSpacing;
reversed = !reversed;
crossAxisOffset =
reversed ? maxCrossAxisExtent - crossAxisSpacing : crossAxisSpacing;
}
return SliverPatternGridGeometries(tiles: geometries, bounds: geometries);
}