flutter / flutter/flutter

[two_dimensional_scrollables] TableView trailing pinned spans are laid out twice

Open
#185,842 0 comments 0 reactions 0 assignees View on GitHub
has partial patch p: two_dimensional_scrollables P2 package team-ecosystem triaged-ecosystem
Dominant language
Dart
Stars
179k
Forks
31.1k
PR merge metrics
PR metrics pending

Description

### Description
In `TableView`, when `trailingPinnedColumnCount` or `trailingPinnedRowCount` is greater than 0, the spans designated as trailing pinned are being incorrectly included in the range of "regular" (non-pinned) spans. This results in these cells being built and laid out twice during every layout pass.

### Steps to Reproduce
1. Create a `TableView` with a large number of rows/columns.
2. Set `trailingPinnedColumnCount: 1`.
3. Observe (e.g., via logs in `cellBuilder`) that cells in the last column are built twice.

### Expected Results
Each `TableVicinity` should be built and laid out exactly once per layout pass. Trailing pinned spans should be excluded from the "non-pinned" range.

### Actual Results
Trailing pinned spans are included in the non-pinned range because the range is capped by the total metrics length rather than the index of the first trailing pinned span.

### Root Cause
In `RenderTableViewport._updateFirstAndLastVisibleCell` (`lib/src/table_view/table.dart`), the `_lastNonPinnedColumn` and `_lastNonPinnedRow` indices are defaulted to the end of the metrics maps (`metrics.length - 1`) instead of being capped by `_lastRegularColumnIndex` and `_lastRegularRowIndex`.

### Proposed Fix
Update the capping logic to use the pre-calculated regular span indices (`_lastRegularColumnIndex` / `_lastRegularRowIndex`).

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.