diff --git a/packages/flutter/lib/src/rendering/table.dart b/packages/flutter/lib/src/rendering/table.dart index 5cafdd2fcab..0c1829b01bb 100644 --- a/packages/flutter/lib/src/rendering/table.dart +++ b/packages/flutter/lib/src/rendering/table.dart @@ -960,6 +960,9 @@ class RenderTable extends RenderBox { @override double computeMinIntrinsicWidth(double height) { assert(_children.length == rows * columns); + if (rows * columns == 0) { + return 0.0; + } var totalMinWidth = 0.0; for (var x = 0; x < columns; x += 1) { final TableColumnWidth columnWidth = _columnWidths[x] ?? defaultColumnWidth; @@ -972,6 +975,9 @@ class RenderTable extends RenderBox { @override double computeMaxIntrinsicWidth(double height) { assert(_children.length == rows * columns); + if (rows * columns == 0) { + return 0.0; + } var totalMaxWidth = 0.0; for (var x = 0; x < columns; x += 1) { final TableColumnWidth columnWidth = _columnWidths[x] ?? defaultColumnWidth; @@ -986,6 +992,9 @@ class RenderTable extends RenderBox { // winner of the 2016 world's most expensive intrinsic dimension function award // honorable mention, most likely to improve if taught about memoization award assert(_children.length == rows * columns); + if (rows * columns == 0) { + return 0.0; + } final List widths = _computeColumnWidths(BoxConstraints.tightForFinite(width: width)); var rowTop = 0.0; for (var y = 0; y < rows; y += 1) { diff --git a/packages/flutter/test/rendering/table_test.dart b/packages/flutter/test/rendering/table_test.dart index c8d4ef888b3..a2da4feef47 100644 --- a/packages/flutter/test/rendering/table_test.dart +++ b/packages/flutter/test/rendering/table_test.dart @@ -401,4 +401,26 @@ void main() { expect(table.size, equals(size)); expect(table.defaultVerticalAlignment, TableCellVerticalAlignment.intrinsicHeight); }); + + test('Empty table intrinsic dimensions should not crash', () { + // Test that empty tables (0 rows x 0 columns) don't cause division by zero + // when intrinsic size methods are called with non-zero constraints. + final table = RenderTable(textDirection: TextDirection.ltr); + + // Verify table is empty + expect(table.rows, equals(0)); + expect(table.columns, equals(0)); + + // These should all return 0.0 without crashing (previously caused division by zero) + expect(table.getMinIntrinsicWidth(100.0), equals(0.0)); + expect(table.getMaxIntrinsicWidth(100.0), equals(0.0)); + expect(table.getMinIntrinsicHeight(100.0), equals(0.0)); + expect(table.getMaxIntrinsicHeight(100.0), equals(0.0)); + + // Also test with infinite constraints + expect(table.getMinIntrinsicWidth(double.infinity), equals(0.0)); + expect(table.getMaxIntrinsicWidth(double.infinity), equals(0.0)); + expect(table.getMinIntrinsicHeight(double.infinity), equals(0.0)); + expect(table.getMaxIntrinsicHeight(double.infinity), equals(0.0)); + }); }