Skip to content

perf(grid): do not re-sort the whole result on every staged cell edit (#875) - #970

Merged
ZhuchkaTriplesix merged 1 commit into
devfrom
issue/875-grid-avoid-full-resort-on-edit
Sep 25, 2026
Merged

ZhuchkaTriplesix merged 1 commit into
devfrom
issue/875-grid-avoid-full-resort-on-edit

Conversation

@ZhuchkaTriplesix

Copy link
Copy Markdown
Member

Описание изменений

  • Правка ячейки не меняет число строк, поэтому VirtualResultGrid больше не пересортировывает весь результат при каждом уведомлении staging-буфера. Порядок отображения сохраняется, а список строк пересобирается по существующей перестановке за O(N) (_refreshSortedRowValues). Отредактированная строка не «прыгает» во время ввода.
  • Полная пересортировка остаётся при смене колонки сортировки, вставке и удалении строк, а также при активном фильтре (rowIndicesMapping).
  • didUpdateWidget больше не сортирует повторно, когда изменился только список rows, а строки берутся из staging-буфера без фильтра. Раньше родитель (ResultsTab) передавал новый список на каждую правку, и сортировка выполнялась второй раз.
  • Идущая в isolate сортировка инвалидируется (_sortVersion++), чтобы устаревший результат не откатил свежие значения.
  • Тесты в result_grid_sorting_model_test.dart (5 новых, в том числе с пересборкой родителя): порядок сохраняется, новое значение видно, удаление после правки попадает в верную model-строку, вставка строки по-прежнему пересортировывает. Проверил, что новые тесты падают на старом коде. Весь файл прогнал локально, 10 проходят.

Не входит

  • Пересчёт ширины колонок и effectiveRows на каждое уведомление (O(R)) остались как были.
  • Быстрый путь не действует при активном фильтре: там по-прежнему полная пересортировка.
  • Отдельный setState в _commitEdit: Flutter объединяет их в один build, отдельной правки не потребовалось.

Связанные Issue

Closes #875

…Closes #875)

With a sort column active, every staging notification re-sorted all rows
(O(N log N), an isolate copy from 3000 rows), and the parent handing over a
fresh rows list re-sorted a second time through didUpdateWidget.

A cell edit does not change the row count, so keep the current visual order and
rebuild the displayed row list from the existing permutation in O(N); the edited
row no longer jumps while typing. Re-sort still happens on a sort-column change,
row insert/delete, or a filter mapping. didUpdateWidget skips the sort when only
the rows list changed and the rows come from the staging buffer, and an
in-flight isolate sort is invalidated so it cannot revert fresher values.
@github-actions github-actions Bot added frontend Theme parser epic label: frontend performance Theme parser epic label: performance data-grid Interactive data grid, cell editor, filtering, groupings labels Sep 25, 2026
@github-actions github-actions Bot added this to the 0.4.18 milestone Sep 25, 2026
@ZhuchkaTriplesix
ZhuchkaTriplesix merged commit ee6971d into dev Sep 25, 2026
3 checks passed
@ZhuchkaTriplesix
ZhuchkaTriplesix deleted the issue/875-grid-avoid-full-resort-on-edit branch September 28, 2026 08:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

data-grid Interactive data grid, cell editor, filtering, groupings frontend Theme parser epic label: frontend performance Theme parser epic label: performance

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant