getGeometries method
Returns the geometries of each tiles in the pattern.
Implementation
@override
SliverPatternGridGeometries getGeometries(
SliverConstraints constraints,
int crossAxisCount,
) {
final isHorizontal = constraints.axis == Axis.horizontal;
final usableCrossAxisExtent = isHorizontal
? constraints.crossAxisExtent - crossAxisCount * tileBottomSpace
: constraints.crossAxisExtent;
final crossAxisExtent =
(usableCrossAxisExtent + crossAxisSpacing) / crossAxisCount -
crossAxisSpacing;
final crossAxisStride = crossAxisExtent + crossAxisSpacing;
final patternCount = pattern.length;
// The minimum aspect ratio give us the main axis extent of a track.
final maxMainAxisExtentRatio =
pattern.map((t) => t.crossAxisRatio / t.aspectRatio).reduce(math.max);
final mainAxisExtent = crossAxisExtent * maxMainAxisExtentRatio +
(isHorizontal ? 0 : tileBottomSpace);
// We always provide 2 tracks where the layout follow this pattern:
// A B A || A B A B || A B C || A B C A
// B A B || B A B A || C B A || B A C B
final count = crossAxisCount * 2;
final tiles = List.filled(count, kZeroGeometry);
final bounds = List.filled(count, kZeroGeometry);
for (int i = 0; i < count; i++) {
final startScrollOffset =
i < crossAxisCount ? 0.0 : mainAxisExtent + mainAxisSpacing;
final tilePatternIndex = i < crossAxisCount
? i % patternCount
: (count - 1 - (i % crossAxisCount)) % patternCount;
final tilePattern = pattern[tilePatternIndex];
final tileCrossAxisExtent = crossAxisExtent * tilePattern.crossAxisRatio +
(isHorizontal ? tileBottomSpace : 0);
final tileMainAxisExtent = tileCrossAxisExtent / tilePattern.aspectRatio +
(isHorizontal ? 0 : tileBottomSpace);
final effectiveTextDirection =
i < crossAxisCount ? TextDirection.ltr : TextDirection.rtl;
final effectiveAlignment =
tilePattern.alignment.resolve(effectiveTextDirection);
final rect = effectiveAlignment.inscribe(
Size(tileCrossAxisExtent, tileMainAxisExtent),
Rect.fromLTWH(0, 0, crossAxisExtent, mainAxisExtent),
);
final startCrossAxisOffset = (i % crossAxisCount) * crossAxisStride;
tiles[i] = SliverGridGeometry(
scrollOffset: startScrollOffset + rect.top,
crossAxisOffset: startCrossAxisOffset + rect.left,
mainAxisExtent: tileMainAxisExtent,
crossAxisExtent: tileCrossAxisExtent,
);
bounds[i] = SliverGridGeometry(
scrollOffset: startScrollOffset,
crossAxisOffset: startCrossAxisOffset,
mainAxisExtent: mainAxisExtent,
crossAxisExtent: crossAxisExtent,
);
}
return SliverPatternGridGeometries(tiles: tiles, bounds: bounds);
}