Crash bij verlaten videodia: setState tijdens gelockte widgettree (VideoPlayheadBus.clearFor) #1114
Labels
No labels
accepted
bug
declined
docs
duplicate
enhancement
good first issue
in-progress
needs-info
privacy
security
triage
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
LibreKAT/Ocideck#1114
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
Bij het weg-navigeren van een dia met (afspelende) video gooit Flutter tijdens het tekenen van het frame:
De crash komt uit
VideoPlayheadBus.clearFor→_VideoPreviewState.disposetijdensBuildOwner.finalizeTree.Oorzaak
VideoPlayheadBus.clearFor(lib/widgets/slides/video_playhead_bus.dart) zetcurrent.value = null. Dat gebeurt vanuitdispose()van_VideoPreviewStateén_VideoEmbedPreviewState(lib/widgets/slides/previews/media_previews_video.dart), die draait tijdensfinalizeTree— de element-tree is dan gelockt. De video-editor luistert live mee via eenValueListenableBuilder<VideoPlayhead?>(de "Knip hier"-knop inlib/widgets/editors/video_slide_editor.dart); dienssetStatevalt onder de lock en gooit de assertie. Beide dispose-paden raken het, dus de fix hoort in de bus.Aanpak
Centraal in de bus: draait er een frame (
schedulerPhase == persistentCallbacks), stel de clear dan uit tot ná het frame (addPostFrameCallback); anders synchroon wissen. DeslideId-guard maakt de uitgestelde clear een no-op als een andere dia intussen zelf een afspeelpunt publiceert, zodat er geen vers afspeelpunt wordt weggegooid.Regressietest:
test/video_playhead_bus_test.dart(reproduceert de exacte assertie zonder de fix, groen met de fix).