findOptimalPreset function
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,
Находит оптимальный пресет для заданных параметров.
Перебирает все пресеты и выбирает тот, который позволяет заполнить максимум пространства (минимум свободного места).
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;
}