Skip to content

Commit 0c09049

Browse files
committed
More edge cases
1 parent c62a209 commit 0c09049

File tree

2 files changed

+116
-23
lines changed

2 files changed

+116
-23
lines changed

packages/two_dimensional_scrollables/lib/src/table_view/table.dart

Lines changed: 54 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -667,16 +667,20 @@ class RenderTableViewport extends RenderTwoDimensionalViewport {
667667
}) {
668668
// TODO(Piinks): Assert here or somewhere else merged cells cannot span
669669
// pinned and unpinned cells (for merged cell follow-up), https://github.com/flutter/flutter/issues/131224
670+
_Span colSpan, rowSpan;
670671
double yPaintOffset = -offset.dy;
671672
for (int row = start.row; row <= end.row; row += 1) {
672673
double xPaintOffset = -offset.dx;
673-
final double rowHeight = _rowMetrics[row]!.extent;
674-
yPaintOffset += _rowMetrics[row]!.configuration.padding.leading;
674+
rowSpan = _rowMetrics[row]!;
675+
final double rowHeight = rowSpan.extent;
676+
yPaintOffset += rowSpan.configuration.padding.leading;
675677
for (int column = start.column; column <= end.column; column += 1) {
676-
final double columnWidth = _columnMetrics[column]!.extent;
677-
xPaintOffset += _columnMetrics[column]!.configuration.padding.leading;
678+
colSpan = _columnMetrics[column]!;
679+
final double columnWidth = colSpan.extent;
680+
xPaintOffset += colSpan.configuration.padding.leading;
678681

679682
final TableVicinity vicinity = TableVicinity(column: column, row: row);
683+
print(vicinity);
680684
// TODO(Piinks): Add back merged cells, https://github.com/flutter/flutter/issues/131224
681685

682686
final RenderBox? cell = buildOrObtainChildFor(vicinity);
@@ -840,10 +844,11 @@ class RenderTableViewport extends RenderTwoDimensionalViewport {
840844
final LinkedHashMap<Rect, TableSpanDecoration> backgroundColumns =
841845
LinkedHashMap<Rect, TableSpanDecoration>();
842846

847+
final _Span rowSpan = _rowMetrics[leading.row]!;
843848
for (int column = leading.column; column <= trailing.column; column++) {
844-
final _Span span = _columnMetrics[column]!;
845-
if (span.configuration.backgroundDecoration != null ||
846-
span.configuration.foregroundDecoration != null) {
849+
final _Span columnSpan = _columnMetrics[column]!;
850+
if (columnSpan.configuration.backgroundDecoration != null ||
851+
columnSpan.configuration.foregroundDecoration != null) {
847852
final RenderBox leadingCell = getChildFor(
848853
TableVicinity(column: column, row: leading.row),
849854
)!;
@@ -852,17 +857,28 @@ class RenderTableViewport extends RenderTwoDimensionalViewport {
852857
)!;
853858

854859
final Rect rect = Rect.fromPoints(
855-
parentDataOf(leadingCell).paintOffset! + offset,
860+
parentDataOf(leadingCell).paintOffset! +
861+
offset -
862+
Offset(
863+
columnSpan.configuration.padding.leading,
864+
rowSpan.configuration.padding.leading,
865+
),
856866
parentDataOf(trailingCell).paintOffset! +
857867
Offset(trailingCell.size.width, trailingCell.size.height) +
858-
offset,
868+
offset +
869+
Offset(
870+
columnSpan.configuration.padding.trailing,
871+
rowSpan.configuration.padding.trailing,
872+
),
859873
);
860874

861-
if (span.configuration.backgroundDecoration != null) {
862-
backgroundColumns[rect] = span.configuration.backgroundDecoration!;
875+
if (columnSpan.configuration.backgroundDecoration != null) {
876+
backgroundColumns[rect] =
877+
columnSpan.configuration.backgroundDecoration!;
863878
}
864-
if (span.configuration.foregroundDecoration != null) {
865-
foregroundColumns[rect] = span.configuration.foregroundDecoration!;
879+
if (columnSpan.configuration.foregroundDecoration != null) {
880+
foregroundColumns[rect] =
881+
columnSpan.configuration.foregroundDecoration!;
866882
}
867883
}
868884
}
@@ -873,10 +889,11 @@ class RenderTableViewport extends RenderTwoDimensionalViewport {
873889
final LinkedHashMap<Rect, TableSpanDecoration> backgroundRows =
874890
LinkedHashMap<Rect, TableSpanDecoration>();
875891

892+
final _Span columnSpan = _columnMetrics[leading.column]!;
876893
for (int row = leading.row; row <= trailing.row; row++) {
877-
final _Span span = _rowMetrics[row]!;
878-
if (span.configuration.backgroundDecoration != null ||
879-
span.configuration.foregroundDecoration != null) {
894+
final _Span rowSpan = _rowMetrics[row]!;
895+
if (rowSpan.configuration.backgroundDecoration != null ||
896+
rowSpan.configuration.foregroundDecoration != null) {
880897
final RenderBox leadingCell = getChildFor(
881898
TableVicinity(column: leading.column, row: row),
882899
)!;
@@ -885,16 +902,25 @@ class RenderTableViewport extends RenderTwoDimensionalViewport {
885902
)!;
886903

887904
final Rect rect = Rect.fromPoints(
888-
parentDataOf(leadingCell).paintOffset! + offset,
905+
parentDataOf(leadingCell).paintOffset! +
906+
offset -
907+
Offset(
908+
columnSpan.configuration.padding.leading,
909+
rowSpan.configuration.padding.leading,
910+
),
889911
parentDataOf(trailingCell).paintOffset! +
890912
Offset(trailingCell.size.width, trailingCell.size.height) +
891-
offset,
913+
offset +
914+
Offset(
915+
columnSpan.configuration.padding.leading,
916+
rowSpan.configuration.padding.trailing,
917+
),
892918
);
893-
if (span.configuration.backgroundDecoration != null) {
894-
backgroundRows[rect] = span.configuration.backgroundDecoration!;
919+
if (rowSpan.configuration.backgroundDecoration != null) {
920+
backgroundRows[rect] = rowSpan.configuration.backgroundDecoration!;
895921
}
896-
if (span.configuration.foregroundDecoration != null) {
897-
foregroundRows[rect] = span.configuration.foregroundDecoration!;
922+
if (rowSpan.configuration.foregroundDecoration != null) {
923+
foregroundRows[rect] = rowSpan.configuration.foregroundDecoration!;
898924
}
899925
}
900926
}
@@ -1032,7 +1058,12 @@ class _Span
10321058
bool get isPinned => _isPinned;
10331059
late bool _isPinned;
10341060

1035-
double get trailingOffset => leadingOffset + extent;
1061+
double get trailingOffset {
1062+
return leadingOffset +
1063+
extent +
1064+
configuration.padding.leading +
1065+
configuration.padding.trailing;
1066+
}
10361067

10371068
// ---- Span Management ----
10381069

packages/two_dimensional_scrollables/test/table_view/table_test.dart

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -686,6 +686,68 @@ void main() {
686686
expect(rowExtent.delegate.viewportExtent, 600.0);
687687
});
688688

689+
testWidgets('Does not lay out extra children on account of padding', (WidgetTester tester) async {
690+
final ScrollController verticalController = ScrollController();
691+
final ScrollController horizontalController = ScrollController();
692+
// Large column padding
693+
TableView tableView = TableView.builder(
694+
rowCount: 50,
695+
columnCount: 50,
696+
// This padding is so high, no children should be laid out.
697+
columnBuilder: (_) => const TableSpan(
698+
extent: FixedTableSpanExtent(100),
699+
padding: TableSpanPadding(leading: 1051), // 800 viewport width, 250 cacheExtent.
700+
),
701+
rowBuilder: (_) => span,
702+
cellBuilder: (_, TableVicinity vicinity) {
703+
return SizedBox.square(
704+
dimension: 100,
705+
child: Text('Row: ${vicinity.row} Column: ${vicinity.column}'),
706+
);
707+
},
708+
);
709+
710+
await tester.pumpWidget(MaterialApp(home: tableView));
711+
await tester.pumpAndSettle();
712+
// All of these children are so offset by the padding they are outside of
713+
// the viewport and cache extent
714+
expect(find.text('Row: 0 Column: 0'), findsNothing);
715+
expect(find.text('Row: 1 Column: 0'), findsNothing);
716+
expect(find.text('Row: 0 Column: 1'), findsNothing);
717+
expect(find.text('Row: 1 Column: 1'), findsNothing);
718+
719+
// Large row padding
720+
tableView = TableView.builder(
721+
rowCount: 50,
722+
columnCount: 50,
723+
// This padding is so high, no children should be laid out.
724+
rowBuilder: (_) => const TableSpan(
725+
extent: FixedTableSpanExtent(100),
726+
padding: TableSpanPadding(leading: 851), // 600 viewport height, + 250 cacheExtent
727+
),
728+
columnBuilder: (_) => span,
729+
cellBuilder: (_, TableVicinity vicinity) {
730+
return SizedBox.square(
731+
dimension: 100,
732+
child: Text('Row: ${vicinity.row} Column: ${vicinity.column}'),
733+
);
734+
},
735+
);
736+
737+
await tester.pumpWidget(MaterialApp(home: tableView));
738+
await tester.pumpAndSettle();
739+
// All of these children are so offset by the padding they are outside of
740+
// the viewport and cache extent
741+
expect(find.text('Row: 0 Column: 0'), findsNothing);
742+
expect(find.text('Row: 1 Column: 0'), findsNothing);
743+
expect(find.text('Row: 0 Column: 1'), findsNothing);
744+
expect(find.text('Row: 1 Column: 1'), findsNothing);
745+
746+
// Check with pinned rows and columns
747+
748+
// Check with eventually accrued paddings
749+
});
750+
689751
testWidgets('regular layout - no pinning', (WidgetTester tester) async {
690752
final ScrollController verticalController = ScrollController();
691753
final ScrollController horizontalController = ScrollController();

0 commit comments

Comments
 (0)