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