Skip to content

Commit 1e10781

Browse files
authored
Try catch possible errors during table layout (#846)
1 parent 217b7af commit 1e10781

File tree

2 files changed

+37
-7
lines changed

2 files changed

+37
-7
lines changed

packages/core/lib/src/widgets/html_table.dart

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,15 @@ class _TableRenderObject extends RenderBox
421421
if (width != null) {
422422
drySizes.add(Size(width, .0));
423423
} else {
424-
drySizes.add(_performLayoutDry(child, const BoxConstraints()));
424+
var drySize =
425+
Size(constraints.hasBoundedWidth ? constraints.maxWidth : 100.0, 0);
426+
try {
427+
drySize = _performLayoutDry(child, const BoxConstraints());
428+
} catch (dryLayoutError, stackTrace) {
429+
debugPrint('Ignored _performLayoutDry error: '
430+
'$dryLayoutError\n$stackTrace');
431+
}
432+
drySizes.add(drySize);
425433
}
426434

427435
columnCount = max(columnCount, data.columnStart + data.columnSpan);
@@ -477,13 +485,23 @@ class _TableRenderObject extends RenderBox
477485
}
478486

479487
if (columnWidthSmallerThanDry) {
480-
// this call is expensive, we try to avoid it as much as possible
481-
final minWidth = child.getMinIntrinsicWidth(double.infinity);
482-
final minColumnWidth = (minWidth - columnGaps) / data.columnSpan;
488+
double? minWidth;
489+
try {
490+
// this call is expensive, we try to avoid it as much as possible
491+
// width being smaller than dry size means the table is too crowded
492+
// calculating min to avoid breaking line in the middle of a word
493+
minWidth = child.getMinIntrinsicWidth(double.infinity);
494+
} catch (minWidthError, stackTrace) {
495+
debugPrint('Ignored getMinIntrinsicWidth error: '
496+
'$minWidthError\n$stackTrace');
497+
}
483498

484-
for (var c = 0; c < data.columnSpan; c++) {
485-
final column = data.columnStart + c;
486-
columnWidths[column] = max(columnWidths[column], minColumnWidth);
499+
if (minWidth != null) {
500+
final minColumnWidth = (minWidth - columnGaps) / data.columnSpan;
501+
for (var c = 0; c < data.columnSpan; c++) {
502+
final column = data.columnStart + c;
503+
columnWidths[column] = max(columnWidths[column], minColumnWidth);
504+
}
487505
}
488506
}
489507
}

packages/core/test/tag_table_test.dart

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -724,6 +724,18 @@ Future<void> main() async {
724724
expect(urls, equals(const [href]));
725725
});
726726

727+
testWidgets('handles dry layout / intrinsic errors', (tester) async {
728+
final explained = await explain(
729+
tester,
730+
'<table>'
731+
'<tr><td>Hello <ruby>foo<rt>bar</rt></ruby></td></tr>'
732+
'</table>',
733+
useExplainer: false,
734+
);
735+
expect(explained, contains('RichText(text: "foo")'));
736+
expect(explained, contains('RichText(text: "bar")'));
737+
});
738+
727739
final goldenSkipEnvVar = Platform.environment['GOLDEN_SKIP'];
728740
final goldenSkip = goldenSkipEnvVar == null
729741
? Platform.isLinux

0 commit comments

Comments
 (0)