of static method

TableViewMetricsResolver of(
  1. List<AbstractTableColumn> columns,
  2. double rowHeight,
  3. int length,
  4. BoxConstraints constraints, {
  5. bool roundWidths = false,
})

Implementation

static TableViewMetricsResolver of(
  List<AbstractTableColumn> columns,
  double rowHeight,
  int length,
  BoxConstraints constraints, {
  bool roundWidths = false,
}) {
  assert(constraints.runtimeType == BoxConstraints);
  double totalFlexWidth = 0;
  double totalFixedWidth = 0;
  final List<double> resolvedWidths = List<double>.filled(columns.length, 0);
  final Map<int, AbstractTableColumn> flexColumns = <int, AbstractTableColumn>{};

  // Reserve space for the fixed-width columns first.
  for (int i = 0; i < columns.length; i++) {
    final AbstractTableColumn column = columns[i];
    if (column.width.isFlex) {
      final FlexTableColumnWidth widthSpecification = column.width as FlexTableColumnWidth;
      totalFlexWidth += widthSpecification.width;
      flexColumns[i] = column;
    } else {
      double columnWidth = column.width.width;
      if (roundWidths) {
        columnWidth = columnWidth.roundToDouble();
      }
      totalFixedWidth += columnWidth;
      resolvedWidths[i] = columnWidth;
    }
  }

  double maxWidthDelta = constraints.maxWidth - totalFixedWidth;
  if (maxWidthDelta.isNegative) {
    // The fixed-width columns have already exceeded the maxWidth constraint;
    // truncate trailing column widths until we meet the constraint.
    for (int i = resolvedWidths.length - 1; i >= 0; i--) {
      final double width = resolvedWidths[i];
      if (width > 0) {
        final double adjustedWidth = math.max(width + maxWidthDelta, 0);
        final double adjustment = width - adjustedWidth;
        maxWidthDelta += adjustment;
        if (maxWidthDelta >= 0) {
          break;
        }
      }
    }
    assert(() {
      if (maxWidthDelta < -_kDoublePrecisionTolerance) {
        FlutterError.reportError(FlutterErrorDetails(
          exception: 'TableView column width adjustment was unable to satisfy the '
              'maxWidth constraint',
          stack: StackTrace.current,
          library: 'payouts',
        ));
      }
      return true;
    }());
  } else if (flexColumns.isNotEmpty) {
    // There's still width to spare after fixed-width column allocations.
    double flexAllocation = 0;
    if (maxWidthDelta.isFinite) {
      flexAllocation = maxWidthDelta;
    } else if (totalFixedWidth < constraints.minWidth) {
      flexAllocation = constraints.minWidth - totalFixedWidth;
    }
    if (flexAllocation > 0) {
      for (MapEntry<int, AbstractTableColumn> flexColumn in flexColumns.entries) {
        final FlexTableColumnWidth widthSpecification =
            flexColumn.value.width as FlexTableColumnWidth;
        final double allocationPercentage = widthSpecification.width / totalFlexWidth;
        double columnWidth = flexAllocation * allocationPercentage;
        if (roundWidths) {
          columnWidth = columnWidth.roundToDouble();
        }
        resolvedWidths[flexColumn.key] = columnWidth;
      }
    }
  }

  double left = 0;
  final List<Range> resolvedColumnBounds = List<Range>.generate(columns.length, (int index) {
    final double right = left + resolvedWidths[index];
    final Range result = Range(left, right);
    left = right;
    return result;
  });

  return TableViewMetricsResolver._(
    columns,
    constraints,
    rowHeight,
    length,
    resolvedColumnBounds,
  );
}