of static method
TableViewMetricsResolver
of(
- List<
AbstractTableColumn> columns, - double rowHeight,
- int length,
- BoxConstraints constraints, {
- 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,
);
}