performLayout method

  1. @override
void performLayout(
  1. Size size
)
override

Override this method to lay out and position all children given this widget's size.

This method must call layoutChild for each child. It should also specify the final position of each child with positionChild.

Implementation

@override
void performLayout(Size size) {
  final int effectiveCount = itemCount.clamp(0, maxItems);
  if (effectiveCount <= 0) {
    _layoutAllAtZero();
    return;
  }
  final TileSizePreset optimalPreset = findOptimalPreset(
    layoutSize: size,
    itemCount: effectiveCount,
    maxItems: maxItems,
    itemPadding: itemPadding,
    alignment: alignment,
    gridPadding: gridPadding,
    aspectRatio: aspectRatio,
    presets: presets,
  );
  if (optimalPreset.name != _lastPresetName) {
    _lastPresetName = optimalPreset.name;
    assert(() {
      debugPrint(
        'FitGrid: выбран пресет "${optimalPreset.name}", maxItemSize=${optimalPreset.size}',
      );
      return true;
    }());
  }
  final TileLayoutCalculator calculator = TileLayoutCalculator(
    layoutSize: size,
    itemCount: effectiveCount,
    maxItems: maxItems,
    itemPadding: itemPadding,
    alignment: alignment,
    aspectRatio: aspectRatio,
    maxItemSize: optimalPreset.size,
    gridPadding: gridPadding,
  );
  final ({Size itemSize, int columns, int rows, Offset gridOffset}) grid =
      calculator.calculateGrid();
  final Size itemSize = grid.itemSize;
  final int columns = grid.columns;
  final int rows = grid.rows;
  final Offset gridOffset = grid.gridOffset;
  if (itemSize == Size.zero || columns <= 0) {
    _layoutAllAtZero();
    return;
  }
  final int totalRows = rows;
  final double fullRowWidth =
      columns * itemSize.width + (columns - 1) * itemPadding.width;
  for (int i = 0; i < effectiveCount; i++) {
    if (!hasChild(i)) continue;
    layoutChild(i, BoxConstraints.tight(itemSize));
    final int col = i % columns;
    final int row = i ~/ columns;
    final bool isLastRow = row == totalRows - 1;
    final int itemsInRow =
        isLastRow ? effectiveCount - row * columns : columns;
    double rowOffsetX = 0;
    if (itemsInRow < columns) {
      final double rowWidth =
          itemsInRow * itemSize.width + (itemsInRow - 1) * itemPadding.width;
      final double freeSpace = fullRowWidth - rowWidth;
      rowOffsetX = freeSpace * (alignment.x + 1) / 2;
    }
    final double x = gridOffset.dx +
        rowOffsetX +
        col * (itemSize.width + itemPadding.width);
    final double y =
        gridOffset.dy + row * (itemSize.height + itemPadding.height);
    positionChild(i, Offset(x, y));
  }
}