AppFlowy-IO / AppFlowy-IO/appflowy-editor
Editing a table then defocusing freezes the app (infinite row-height relayout loop)
- Ngôn ngữ chính
- Dart
- Star
- 684
- Fork
- 329
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Mô tả
### Description
On mobile, PWA app - editing a table cell and then defocusing it (tapping/clicking outside the cell) reliably freezes the app. The UI isolate is pinned at 100% and the app stops responding (ANR on Android). No exception is thrown, so it surfaces as a hang rather than a crash nothing reaches `FlutterError.onError`, `PlatformDispatcher.onError`, or any `try/catch`.
### Steps to reproduce
1. Insert a table into a document on Android + Chrome
2. Focus a cell and type some text.
3. Tap/click outside the cell to defocus it.
4. The editor enters an unbounded relayout loop and stops responding (eventual "Oh, snap")
### Expected behavior
The table settles after the cell is defocused.
### Actual behavior
Continuous relayout; the app freezes.
### Root cause
`TableCol._buildCells` schedules `updateRowHeightCallback` in a post-frame callback on **every build**. That callback calls `TableNode.updateRowHeight`, which writes a new cell/cols height whenever the stored height attribute differs from the measured `children.first.rect.height` using an **exact `!=` comparison**:
```dart
if (_cells[0][row].attributes[TableCellBlockKeys.height] != maxHeight &&
!maxHeight.isNaN) { ... }
...
if (node.attributes[TableBlockKeys.colsHeight] != colsHeight &&
!colsHeight.isNaN) { ... }
```
Measured heights jitter by sub-pixel amounts between frames (device-pixel rounding, and a focus/selection-dependent measurement on mobile). Exact inequality treats that jitter as a real change, so a height transaction is emitted every frame → `editorState.apply(transaction)` → rebuild → re-measure → loop forever. There is no convergence tolerance.
### Environment
- `appflowy_editor`: 6.2.0
- Flutter: 3.41.2 stable
- Platform: Android 16 / Chrome
### Proposed fix
Compare the stored and measured heights with a small tolerance (≥ 1 logical pixel) so `updateRowHeight` stops emitting transactions once the height is within a pixel of the measurement. Imperceptible visually, safely above the jitter, and guarantees the loop terminates. A PR with a regression test follows.
Hướng dẫn đóng góp
Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này
Đánh giá
Issue này chưa được đánh giá.