tableColumnWidths function

List<double> tableColumnWidths(
  1. List<TableColumn> columns,
  2. double width, [
  3. Map<String, double> overrides = const {}
])

Implementation

List<double> tableColumnWidths(
  List<TableColumn> columns,
  double width, [
  Map<String, double> overrides = const {},
]) {
  final sized = [
    for (final column in columns) overrides[column.id] ?? column.width,
  ];
  var fixed = 0.0;
  var flex = 0.0;
  var flexCount = 0;
  for (final (index, column) in columns.indexed) {
    final size = sized[index];
    if (size == null) {
      flex += column.flex;
      flexCount++;
    } else {
      fixed += size;
    }
  }
  final free = width - fixed;
  if (overrides.isEmpty ||
      (flexCount > 0 && free >= flexCount * tableColumnMinWidth)) {
    final share = free.clamp(0.0, double.infinity);
    return [
      for (final (index, column) in columns.indexed)
        sized[index] ?? share * column.flex / flex,
    ];
  }
  // The window has shrunk below the dragged widths, or they left no column to
  // take up the slack: everything scales to fit.
  final natural = [for (final size in sized) size ?? tableColumnMinWidth];
  final total = natural.fold<double>(0, (sum, size) => sum + size);
  return [for (final size in natural) size * width / total];
}