[Prestaties][P1] Elke toetsaanslag herbouwt de hele AppShell, alle zichtbare miniaturen en (macOS) het native menu #2623
Labels
No labels
accepted
bug
declined
docs
duplicate
enhancement
good first issue
in-progress
needs-info
privacy
release-blocker
security
triage
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
LibreKAT/Ocideck#2623
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Symptoom
Elke toetsaanslag in een dia kost meer dan nodig, en dat schaalt met het aantal open tabbladen en het aantal zichtbare miniaturen.
Oorzaak
TabsNotifierluistert naar de stroom van elkeDeckNotifieren zet bij elke emissie een nieuwe toestand:state = state.copyWith(tabs: List.from(state.tabs))(lib/state/tabs_provider.dart:258).AppShell.buildwatchttabsProvidervolledig (lib/widgets/app_shell.dart:819), dus de hele shell — menubalk, sneltoetsen,DropTarget, de werkruimte met per-tabProviderScopes — herbouwt bij elke letter, plus deref.listen's die op tabwijzigingen de bannersynchronisatie draaien.AppPlatformMenuBarmaakt per build nieuwePlatformMenuItems (lib/widgets/shell/app_menu_bar.dart:81). Flutter vergelijkt die metlistEqualsop identiteit (platform_menu_bar.dart,didUpdateWidget) en serialiseert bij verschil het hele menu over het platformkanaal — dus per toetsaanslag.SlideListPanelwatcht het hele deck (lib/widgets/panels/slide_list_panel.dart:614) en bouwt per item een nieuweSlideThumbnailmetdeckScopeCiaIndex(deck.slides)(regel 543) — een gang over álle dia's per zichtbare miniatuur, per toetsaanslag. De render-layoutmemo dempt de tekstinpassing (zie de kop vanslide_layout_metrics.dart: "editing one slide rebuilds every visible thumbnail in the rail even though their slides never changed"), maar de herbouw zelf blijft.Voorgestelde oplossing
TabsNotifieralleen laten uitzenden als een tabfeit verandert (label,isDirty,isOpen, soort, bestandspad): vergelijk een afgeleide signatuur vóórstate =. Wie per toetsaanslag iets nodig heeft, watcht het deck van zijn eigen tab al.enabled-vlag of label verandert), ofAppPlatformMenuBarlaten vergelijken op een signatuur.SlideListPaneldeckbrede waarden (deckScopeCiaIndex,numberedListStarts, split-runindex) één keer per build berekenen en doorgeven; en per dia een widget-instantie cachen zolangSlide-identiteit en de deckbrede invoer gelijk zijn — Flutter slaat dan de herbouw van die miniatuur helemaal over.Wat overeind moet blijven
Dirty-stip en label op het tabblad verversen direct; de beveiligings- en verbeterbanners volgen de tabwissel zoals nu.
Toets
Widgettest met een tellende
build-teller: tien toetsaanslagen in dia 3 →AppShellherbouwt 0 keer (alleen bij de eerste die het tabblad vuil maakt), miniaturen van ongewijzigde dia's herbouwen 0 keer.Onderdeel van de prestatie- en stabiliteitsinspectie van 28-10-2026 (EPIC #2637).