findOptimalPreset function

TileSizePreset findOptimalPreset({
  1. required Size layoutSize,
  2. required int itemCount,
  3. required int maxItems,
  4. required Size itemPadding,
  5. required Alignment alignment,
  6. required EdgeInsets gridPadding,
  7. double? aspectRatio,
  8. List<TileSizePreset> presets = tileSizePresets,
})

Находит оптимальный пресет для заданных параметров.

Перебирает все пресеты и выбирает тот, который позволяет заполнить максимум пространства (минимум свободного места).

Implementation

TileSizePreset findOptimalPreset({
  required Size layoutSize,
  required int itemCount,
  required int maxItems,
  required Size itemPadding,
  required Alignment alignment,
  required EdgeInsets gridPadding,
  double? aspectRatio,
  List<TileSizePreset> presets = tileSizePresets,
}) {
  if (presets.isEmpty) {
    throw ArgumentError.value(
      presets,
      'presets',
      'Список пресетов не должен быть пустым',
    );
  }
  TileSizePreset? bestPreset;
  double maxFillRatio = 0;
  for (final TileSizePreset preset in presets) {
    final TileLayoutCalculator calculator = TileLayoutCalculator(
      layoutSize: layoutSize,
      itemCount: itemCount,
      maxItems: maxItems,
      itemPadding: itemPadding,
      alignment: alignment,
      aspectRatio: aspectRatio,
      maxItemSize: preset.size,
      gridPadding: gridPadding,
    );

    final ({Size itemSize, int columns, int rows, Offset gridOffset}) grid =
        calculator.calculateGrid();
    if (grid.itemSize == Size.zero) continue;
    // Рассчитываем коэффициент заполнения
    final double gridWidth = grid.columns * grid.itemSize.width +
        (grid.columns - 1) * itemPadding.width;
    final double gridHeight =
        grid.rows * grid.itemSize.height + (grid.rows - 1) * itemPadding.height;
    final double effectiveWidth = layoutSize.width - gridPadding.horizontal;
    final double effectiveHeight = layoutSize.height - gridPadding.vertical;
    final double effectiveArea = effectiveWidth * effectiveHeight;
    if (effectiveArea <= 0) continue;
    final double gridArea = gridWidth * gridHeight;
    final double fillRatio = gridArea / effectiveArea;
    if (fillRatio > maxFillRatio) {
      maxFillRatio = fillRatio;
      bestPreset = preset;
    }
  }

  return bestPreset ?? presets.first;
}