Skip to content

Commit 30011db

Browse files
fix: allow wide tables to scroll in RenderMode.listView (#1595)
1 parent 97b172b commit 30011db

3 files changed

Lines changed: 50 additions & 2 deletions

File tree

packages/core/lib/src/internal/ops/tag_table.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ class TagTable {
9292
borderCollapse: borderCollapse == kCssBorderCollapseCollapse,
9393
borderSpacing: borderSpacing?.getValue(resolved) ?? 0.0,
9494
textDirection: resolved.directionOrLtr,
95+
useSizingHint: tableTree.sizingInput != null,
9596
children: List.from(
9697
data.builders
9798
.map((builder) => builder(context))

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,27 @@ class HtmlTable extends MultiChildRenderObjectWidget {
2626
/// Default: [TextDirection.ltr].
2727
final TextDirection textDirection;
2828

29+
/// Whether to use [CssSizingHint] for table layout.
30+
///
31+
/// Default: `false`.
32+
final bool useSizingHint;
33+
2934
/// Creates a TABLE widget.
3035
const HtmlTable({
3136
this.border,
3237
this.borderCollapse = false,
3338
this.borderSpacing = 0.0,
3439
required super.children,
3540
this.textDirection = TextDirection.ltr,
41+
this.useSizingHint = false,
3642
super.key,
3743
});
3844

3945
@override
4046
RenderObject createRenderObject(BuildContext context) {
41-
final hint = context.dependOnInheritedWidgetOfExactType<CssSizingHint>();
47+
final hint = useSizingHint
48+
? context.dependOnInheritedWidgetOfExactType<CssSizingHint>()
49+
: null;
4250
return _TableRenderObject(
4351
border,
4452
textDirection,
@@ -74,7 +82,9 @@ class HtmlTable extends MultiChildRenderObjectWidget {
7482

7583
@override
7684
void updateRenderObject(BuildContext context, RenderObject renderObject) {
77-
final hint = context.dependOnInheritedWidgetOfExactType<CssSizingHint>();
85+
final hint = useSizingHint
86+
? context.dependOnInheritedWidgetOfExactType<CssSizingHint>()
87+
: null;
7888
(renderObject as _TableRenderObject)
7989
..setBorder(border)
8090
..setBorderCollapse(borderCollapse)

packages/core/test/tag_table_test.dart

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,43 @@ Future<void> main() async {
6565
// `HtmlTable` should not be put inside another one
6666
expect(explained, isNot(contains('SingleChildScrollView')));
6767
});
68+
69+
testWidgets('scrolls in ListView render mode', (WidgetTester tester) async {
70+
await tester.pumpWidget(
71+
const MaterialApp(
72+
home: Scaffold(
73+
body: SizedBox(
74+
width: 100,
75+
child: HtmlWidget(
76+
'<table><tr>'
77+
'<th>Header 1</th>'
78+
'<th>Header 2</th>'
79+
'<th>Header 3</th>'
80+
'<th>Header 4</th>'
81+
'<th>Header 5</th>'
82+
'<th>Header 6</th>'
83+
'<th>Header 7</th>'
84+
'<th>Header 8</th>'
85+
'<th>Header 9</th>'
86+
'<th>Header 10</th>'
87+
'<th>Header 11</th>'
88+
'<th>Header 12</th>'
89+
'</tr></table>',
90+
renderMode: RenderMode.listView,
91+
),
92+
),
93+
),
94+
),
95+
);
96+
97+
final horizontalScrollable = find.byWidgetPredicate(
98+
(widget) =>
99+
widget is Scrollable && widget.axisDirection == AxisDirection.right,
100+
);
101+
final scrollable = tester.state<ScrollableState>(horizontalScrollable);
102+
103+
expect(scrollable.position.maxScrollExtent, greaterThan(0));
104+
});
68105
});
69106

70107
group('rtl', () {

0 commit comments

Comments
 (0)