AppFlowy-IO / AppFlowy-IO/appflowy-editor

Editing a table then defocusing freezes the app (infinite row-height relayout loop)

Đang mở
#1,213 1 bình luận 0 reaction 0 người được giao Xem trên GitHub
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á.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.