From d0244e3e973083782af31f3842ea73e576f2a69c Mon Sep 17 00:00:00 2001 From: Serhii Shalamov Date: Mon, 11 May 2026 12:35:51 +0200 Subject: [PATCH] fix: ignore tight ListView min width for auto table sizing (#1595) --- .../core/lib/src/internal/ops/tag_table.dart | 24 ++++++++++- packages/core/test/tag_table_test.dart | 40 +++++++++++++++++++ 2 files changed, 63 insertions(+), 1 deletion(-) diff --git a/packages/core/lib/src/internal/ops/tag_table.dart b/packages/core/lib/src/internal/ops/tag_table.dart index bdf066e16..9a15e2387 100644 --- a/packages/core/lib/src/internal/ops/tag_table.dart +++ b/packages/core/lib/src/internal/ops/tag_table.dart @@ -86,6 +86,7 @@ class TagTable { final layoutBuilder = HtmlLayoutBuilder( builder: (context, bc) { final resolved = tableTree.inheritanceResolvers.resolve(context); + final minWidth = _getMinWidthHint(tableTree, resolved, bc); Widget built = ValignBaselineContainer( child: HtmlTable( border: border.getBorder(resolved), @@ -104,7 +105,7 @@ class TagTable { // provide hints to size the columns properly built = CssSizingHint( maxWidth: bc.maxWidth, - minWidth: bc.minWidth, + minWidth: minWidth, child: built, ); @@ -119,6 +120,27 @@ class TagTable { return WidgetPlaceholder(debugLabel: kTagTable, child: layoutBuilder); } + double _getMinWidthHint( + BuildTree tableTree, + InheritedProperties resolved, + BoxConstraints bc, + ) { + final input = tableTree.sizingInput; + final widths = [ + input?.preferredWidth, + input?.minWidth, + ].map((v) => v?.getSizing(resolved)?.clamp(0.0, bc.maxWidth)); + + var minWidth = .0; + for (final width in widths) { + if (width != null && width.isFinite) { + minWidth = max(minWidth, width); + } + } + + return minWidth; + } + void _prepareHtmlTableCaptionBuilders(_TagTableData data) { for (final child in data.captions) { final rowIndex = data.rows; diff --git a/packages/core/test/tag_table_test.dart b/packages/core/test/tag_table_test.dart index d42b8d9db..9881148d5 100644 --- a/packages/core/test/tag_table_test.dart +++ b/packages/core/test/tag_table_test.dart @@ -65,6 +65,46 @@ Future main() async { // `HtmlTable` should not be put inside another one expect(explained, isNot(contains('SingleChildScrollView'))); }); + + group('RenderMode.listView', () { + const windowSize = 100.0; + + testWidgets('does not stretch auto width table', (tester) async { + tester.setWindowSize(const Size(windowSize, windowSize)); + + await explain( + tester, + null, + hw: HtmlWidget( + '
Foo
', + key: helper.hwKey, + renderMode: RenderMode.listView, + ), + useExplainer: false, + ); + + final table = tester.renderObject(find.byType(HtmlTable)); + expect(table.size.width, lessThan(windowSize)); + }); + + testWidgets('stretches width 100 percent table', (tester) async { + tester.setWindowSize(const Size(windowSize, windowSize)); + + await explain( + tester, + null, + hw: HtmlWidget( + '
Foo
', + key: helper.hwKey, + renderMode: RenderMode.listView, + ), + useExplainer: false, + ); + + final table = tester.renderObject(find.byType(HtmlTable)); + expect(table.size.width, equals(windowSize)); + }); + }); }); group('rtl', () {