Skip to content

Commit 67470fc

Browse files
authored
[two_dimensional_scrollables] Fix layout offset of merged pinned cells (flutter#6178)
Fixes flutter/flutter#143526 This fixes the layout offset computation when there are merged cells within pinned rows and/or columns in TableView.
1 parent ff587b7 commit 67470fc

File tree

4 files changed

+509
-3
lines changed

4 files changed

+509
-3
lines changed

packages/two_dimensional_scrollables/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 0.1.1
2+
3+
* Fixes a layout issue when pinned cells are merged.
4+
15
## 0.1.0
26

37
* [Breaking change] Adds support for merged cells in the TableView.

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

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -801,15 +801,41 @@ class RenderTableViewport extends RenderTwoDimensionalViewport {
801801
// | <--------- extent of merged cell ---------> |
802802

803803
// Compute height and layout offset for merged rows.
804-
mergedRowOffset = -verticalOffset.pixels +
804+
final bool rowIsInPinnedColumn = _lastPinnedColumn != null &&
805+
vicinity.column <= _lastPinnedColumn!;
806+
final bool rowIsPinned =
807+
_lastPinnedRow != null && firstRow <= _lastPinnedRow!;
808+
final double baseRowOffset =
809+
switch ((rowIsInPinnedColumn, rowIsPinned)) {
810+
// Both row and column are pinned at this cell, or just pinned row.
811+
(true, true) || (false, true) => 0.0,
812+
// Cell is within a pinned column
813+
(true, false) => _pinnedRowsExtent - verticalOffset.pixels,
814+
// Cell is within a pinned row, or no pinned portion.
815+
(false, false) => -verticalOffset.pixels,
816+
};
817+
mergedRowOffset = baseRowOffset +
805818
_rowMetrics[firstRow]!.leadingOffset +
806819
_rowMetrics[firstRow]!.configuration.padding.leading;
807820
mergedRowHeight = _rowMetrics[lastRow]!.trailingOffset -
808821
_rowMetrics[firstRow]!.leadingOffset -
809822
_rowMetrics[lastRow]!.configuration.padding.trailing -
810823
_rowMetrics[firstRow]!.configuration.padding.leading;
811824
// Compute width and layout offset for merged columns.
812-
mergedColumnOffset = -horizontalOffset.pixels +
825+
final bool columnIsInPinnedRow =
826+
_lastPinnedRow != null && vicinity.row <= _lastPinnedRow!;
827+
final bool columnIsPinned =
828+
_lastPinnedColumn != null && firstColumn <= _lastPinnedColumn!;
829+
final double baseColumnOffset =
830+
switch ((columnIsInPinnedRow, columnIsPinned)) {
831+
// Both row and column are pinned at this cell, or just pinned column.
832+
(true, true) || (false, true) => 0.0,
833+
// Cell is within a pinned row.
834+
(true, false) => _pinnedColumnsExtent - horizontalOffset.pixels,
835+
// No pinned portion.
836+
(false, false) => -horizontalOffset.pixels,
837+
};
838+
mergedColumnOffset = baseColumnOffset +
813839
_columnMetrics[firstColumn]!.leadingOffset +
814840
_columnMetrics[firstColumn]!.configuration.padding.leading;
815841
mergedColumnWidth = _columnMetrics[lastColumn]!.trailingOffset -

packages/two_dimensional_scrollables/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: two_dimensional_scrollables
22
description: Widgets that scroll using the two dimensional scrolling foundation.
3-
version: 0.1.0
3+
version: 0.1.1
44
repository: https://github.com/flutter/packages/tree/main/packages/two_dimensional_scrollables
55
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+two_dimensional_scrollables%22+
66

0 commit comments

Comments
 (0)