getGeometries method

  1. @override
SliverPatternGridGeometries getGeometries(
  1. SliverConstraints constraints,
  2. int crossAxisCount
)

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);
}