Browse Source

P1-13: root cause + fix hard bevestigd (MasonryGridView zonder scroll-wrapper) via nieuwe flutter-run---route-truc; P1-19: Wrap Widget-poging gedaan en teruggegeven aan Bob (menuklik registreert niet), plus zustervondst op PUitgaanSliderKaartComponent

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
bob 1 month ago
parent
commit
7870b81b77
2 changed files with 119 additions and 53 deletions
  1. 18 3
      CLAUDE.md
  2. 101 50
      TASKS.md

+ 18 - 3
CLAUDE.md

@@ -223,9 +223,24 @@ export PATH="/home/bob/fvm/bin:$HOME/.pub-cache/bin:$PATH" && /home/bob/Projects
   tool-calls heen. Flutter DevTools (de `devtools`-URL uit dezelfde
   run-log) is zelf ook een Flutter-Web-canvas-app zonder toegankelijke
   DOM — geen bruikbare omweg om alsnog bij de volledige historische
-  foutenlijst te komen. Zie `TASKS.md` P1-13 voor het bekende
-  resterende knelpunt (race tussen `R` sturen en de daaropvolgende
-  deep-link-navigatie bij een tool-call-round-trip ertussen).
+  foutenlijst te komen.
+  **Update 2026-08-09: het `R`+deep-link-race-probleem is opgelost —
+  gebruik `--route` bij het starten in plaats van een hot-restart +
+  losse deep-link.** `fvm flutter run -d <device> --route "/pad?param=waarde"`
+  zet Flutter's `defaultRouteName` al vóór de eerste frame, dus
+  go_router opent direct die pagina — een tussenliggende Home-build
+  (en dus Home's eigen overflow, die anders de enige volledige-dump-
+  slot opsoupeert) vindt niet plaats. Geen FIFO/`R`/`am start` meer
+  nodig wanneer de doelpagina zelf met een directe route+query-param
+  bereikbaar is. Een hot-restart (`R`) blijft altijd terugvallen op de
+  `initialLocation`/Home, en een deep-link-`am start` vlak daarna wordt
+  door de net-herstarte app **niet** opnieuw verwerkt (adb toont dan
+  "Activity not started, intent has been delivered to currently
+  running top-most instance" terwijl de app toch op Home blijft) — dus
+  die combinatie blijft de dump-slot-race verliezen. Het FIFO/`R`-
+  recept hierboven blijft wel nodig voor pagina's die niet met een
+  kale `--route` te bereiken zijn (bv. een crash die pas na meerdere
+  gebruikersacties optreedt).
 
 Daarna automatisch (of gebruik `ff-commit.sh`, zie hieronder):
 1. `git status --short`, dan `git add` — **niet blind `-A`**. Alleen

+ 101 - 50
TASKS.md

@@ -1,11 +1,23 @@
 # Uitgaanskrant — takenlijst
 
-Bijgewerkt: 2026-08-09 (Claude, builder-sessie via MCP + live
-emulator-verificatie). Zie `CLAUDE.md` voor werkinstructies/conventies.
-Elke openstaande taak hieronder is zelfstandig te begrijpen zonder de
-chat gelezen te hebben waarin hij ontstond.
-
-**Deze sessie (2026-08-09):** eerste sessie met `mcp__android__*`-
+Bijgewerkt: 2026-08-09 avond (Claude, builder + emulator-sessie). Zie
+`CLAUDE.md` voor werkinstructies/conventies. Elke openstaande taak
+hieronder is zelfstandig te begrijpen zonder de chat gelezen te hebben
+waarin hij ontstond.
+
+**Deze sessie (2026-08-09, avond):** twee taken opgepakt.
+**P1-19:** builder-fix geprobeerd (Row → Wrap Widget), maar de
+menu-klik registreerde niet (4 pogingen, geen schade) — teruggegeven
+aan Bob met exact stappenplan. **P1-13:** eindelijk de al maanden
+gezochte volledige stack trace gevangen (nieuwe `flutter run
+--route`-truc omzeilt de race met Home's eigen overflow) — root cause
+nu hard bevestigd (niet-scrollbare `MasonryGridView` in een kale
+`Column`) + concreet fix-voorstel, builder-uitvoering nog open. Bijvangst:
+een tweede, nog niet eerder gedocumenteerde instantie van P1-19's
+"kale Row/Column zonder Wrap"-bugfamilie gevonden op
+`PUitgaanSliderKaartComponent:179`.
+
+**Vorige sessie (2026-08-09, middag):** eerste sessie met `mcp__android__*`-
 toegang tot beide emulators (i.p.v. alleen losse `adb`-Bash-commando's)
 — **P0-6 afgerond** (5 debug-knoppen op Login verwijderd, builder +
 export/build + live geverifieerd op telefoon én tablet). Sub-bevinding
@@ -533,53 +545,80 @@ RangeError op deze en de `horecagelegenheidCurrent`-pagina bij een
 niet-bestaande `nid` is al gedekt door P1-1 punt 4 — live bevestigd,
 zie daar.)
 
-**P1-13 · Eigenaar: Claude — bezig (sessie 2026-08-09-c).** Op `HorecagelegenhedenOverzicht` →
-tab "Activiteiten" gooit de kaartjesgrid herhaaldelijk `RenderFlex
-overflowed`-fouten ("on the right", 16-243px, tientallen keren; één
-keer "on the bottom", 2653-5382px) — al meerdere sessies bevestigd
-live aanwezig, **nog geen verse volledige stack trace gevangen**
-(alleen `Another exception was thrown: ...`-kortvorm, zie CLAUDE.md's
-"slechts één volledige dump per proceslevensduur"-notitie).
-- **Betrouwbare reproductie (2026-08-09):** cold-start deep link op
-  `emulator-5554` (**niet** de tablet — die valt op een andere
-  grid-breakpoint en toont hooguit een lege Container, geen overflow):
+**P1-13 · Eigenaar: Onbepaald (root cause + fix nu bekend, builder-werk
+resteert).** Op `HorecagelegenhedenOverzicht` → tab "Activiteiten"
+overflowt de kaartjesgrid. **Root cause definitief bevestigd
+(2026-08-09, Claude, verse volledige stack trace + visuele bevestiging
+op emulator-5554):**
+```
+A RenderFlex overflowed by 5382 pixels on the bottom.
+Column:file:///.../lib/horecagelegenhedenoverzicht/horecagelegenheden_overzicht/horecagelegenheden_overzicht_widget.dart:286:29
+```
+`horecagelegenheden_overzicht_widget.dart:286-382`: de Activiteiten-tab
+is een kale `Column` (`mainAxisSize: MainAxisSize.max`, regel 286) met
+als enige kind een `FutureBuilder` die uiteindelijk een
+`MasonryGridView.builder` bouwt (regel 354) met **`shrinkWrap: true` +
+`physics: NeverScrollableScrollPhysics()`** (regel 355-356/382) — dit
+patroon (shrinkWrapped grid zonder eigen scroll) vereist een
+**scrollbare ouder** om te werken, maar die ontbreekt hier: de `Column`
+zit direct in de `TabBarView`'s `Expanded` (regel 282-284), zonder
+`SingleChildScrollView` eromheen. Met 25 items (regel 340,
+`.take(25)`) × `Container(width: 600.0, height: 225.0)` (regel
+388-390) in 1 kolom op telefoonformaat (`crossAxisCount: 1` onder
+`kBreakpointSmall`, regel 359-363) wil de grid ≈5625px hoog worden
+terwijl de tab maar een fractie daarvan aan ruimte heeft — vandaar de
+5382px-overflow. Verklaart vermoedelijk ook de eerder waargenomen
+kleinere "on the right"-overflows elders in eerdere sessies (los
+bevestigd deze sessie op een ander component: zie P1-19's
+zustervondst op `PUitgaanSliderKaartComponent:179`, zelfde
+"kale-Row/Column-zonder-wrap"-familie maar niet dezelfde plek).
+- **Fix (builder, groter dan een 1-klik-property-wijziging — wél
+  volledig mechanisch/geen ontwerpkeuze):** op
+  `HorecagelegenhedenOverzicht` → Widget Tree → de `Column` (regel 286,
+  binnen de eerste `TabBarView`-tab) → de `FutureBuilder`/`MasonryGridView`-
+  boom **in een `Expanded` wrappen** (zodat de grid een bepaalde hoogte
+  krijgt binnen de Column) **en** op de `MasonryGridView` zelf
+  `Shrink Wrap` uitzetten + physics terug naar de standaard (scrollbare)
+  waarde i.p.v. `Never Scrollable` — waarmee de grid zijn eigen
+  onafhankelijke scroll krijgt. Alternatief, mogelijk eenvoudiger in de
+  builder: de hele Column-inhoud wrappen in een `SingleChildScrollView`
+  (dan mag `shrinkWrap: true` + `NeverScrollableScrollPhysics` blijven
+  staan, zoals dat elders in dit project vaker voorkomt) — welke van de
+  twee makkelijker te zetten is in de builder-UI moet ter plekke
+  blijken. **Nog niet geprobeerd door Claude** (deze sessie ging op aan
+  het vangen van de stack trace zelf) — volgende sessie kan direct met
+  deze twee opties starten. Waarschijnlijk hetzelfde patroon op de
+  andere tabs van deze pagina (Cultuur, Eetgelegenheden, …) — bij het
+  oppakken meteen alle tabs checken, niet alleen Activiteiten.
+- **Reproductierecept dat de race met Home's eigen overflow (P1-19)
+  vermeed (2026-08-09, definitief werkend — vervangt eerdere
+  R+deep-link-pogingen):** `flutter run` **direct starten met
+  `--route`** i.p.v. cold-start via `am start` ná een losse `flutter
+  run`/hot-restart. Dit zet Flutter's `defaultRouteName` al vóór de
+  eerste frame, dus go_router opent meteen de juiste pagina — Home
+  wordt nooit gebouwd, dus zijn eigen overflow (P1-19/P1-3-familie)
+  verbruikt de "één-volledige-dump-per-proces"-slot niet meer eerder:
   ```
-  adb -s emulator-5554 shell am force-stop com.uitgaanskrant.app
-  adb -s emulator-5554 shell am start -a android.intent.action.VIEW -d \
-    "uitgaanskrant://uitgaanskrant.com/horecagelegenhedenOverzicht?plaats=28666" \
-    com.uitgaanskrant.app
+  export PATH="/home/bob/fvm/bin:$HOME/.pub-cache/bin:$PATH"
+  fvm flutter run -d emulator-5554 --route "/horecagelegenhedenOverzicht?plaats=28666"
   ```
-  (`plaats` = verplichte `FFAppState().gemeenteSelectId`, zonder param
-  blijft de pagina leeg — 28666 is de bekende default-gemeente-id uit
-  P0-3.) `Activiteiten` is toevallig al tab-index 0
-  (`horecagelegenheden_overzicht_widget.dart:49`), dus dit landt direct
-  op de juiste tab mét echte data, zonder Home te bouwen — omzeilt het
-  dump-slot-race-probleem voor de cold-start zelf.
-- **Waarom nog steeds geen stack trace, ondanks succesvolle
-  reproductie:** `adb logcat` vangt `FlutterError.dumpErrorToConsole`
-  op dit device/deze Flutter-versie **niet** op (bevestigd leeg, ook al
-  stond de overflow-banner zichtbaar op het scherm) — er is een live
-  VM-service-verbinding nodig (`flutter run`/`attach` met een echte
-  pty, zie CLAUDE.md's `setsid`-recept). Met die verbinding werkt een
-  **hot-restart** (`R`, reset de dump-teller) wél — maar de race tussen
-  `R` versturen en de deep-link-navigatie hierboven is tot nu toe **2x
-  verloren** (~0.3-1s tool-call-overhead, Home's eigen overflow — zie
-  P1-19 — vuurt sneller). **Volgende concrete pogingen, geen van beide
-  nog beproefd:** (a) `R` + de deep-link in **één** Bash-aanroep met
-  een zo kort mogelijke `sleep` ertussen i.p.v. twee losse tool-calls;
-  (b) `flutter attach` (i.p.v. `flutter run`) op het al deep-link-
-  cold-gestarte proces — mogelijk raceloos, nog niet onderzocht; (c)
-  rechtstreeks de Dart VM Service (JSON-RPC/WebSocket, poort staat in
-  de opstart-log) bevragen via curl/een klein script, buiten DevTools'
-  ontoegankelijke canvas-UI om.
+  (geen FIFO/`R`/deep-link-am-start meer nodig voor dít doel. Voor een
+  pagina die zelf niet los bereikbaar is met de juiste parameters via
+  een directe `--route`, blijft het FIFO/`R`-recept uit CLAUDE.md
+  nodig.)
+  **Bevestigd geprobeerd en verworpen:** `R` (hot-restart) + de
+  deep-link-`am start` vlak erna in één Bash-call (minimale sleep) —
+  een hot-restart reset altijd naar de `initialLocation`/Home, en de
+  daarna verstuurde deep-link-intent wordt door de al herstarte app
+  niet meer verwerkt (adb-warning "Activity not started, intent has
+  been delivered to currently running top-most instance" terwijl de
+  app toch weer op Home landde) — dus dit blijft Home's eigen overflow
+  eerst verbruiken. `--route` bij het opstarten zelf is de werkende
+  oplossing voor dit specifieke race-probleem.
 - **Hypothese uit 2026-08-05 (`HorecagelegenheidoverzichtKaartWidget`'s
-  `MediaQuery.sizeOf`-breedtekeuze) weerlegd bij code-heronderzoek
-  2026-08-09:** de tekstkolom zit in een `Expanded`/`Flexible`-Row, die
-  kan qua Flutter-constraint-model niet zelf overflowen — de
-  daadwerkelijke oorzaak ligt elders, mogelijk de buitenste
-  `Container(width: 600.0, height: 225.0)` in
-  `horecagelegenheden_overzicht_widget.dart:388-390`, of iets in het
-  logo/categorie-tag-`Stack` — nog niet vastgesteld.
+  `MediaQuery.sizeOf`-breedtekeuze) blijft weerlegd** — de daadwerkelijke
+  oorzaak is de ontbrekende scroll-wrapper hierboven, niet de
+  tekstkolom-breedtekeuze.
 
 **P1-19 · Eigenaar: Bob (Wrap Widget-menuklik registreert niet, zie
 hieronder — Claude geblokkeerd).** Nieuwe, nog niet eerder gedocumenteerde
@@ -616,6 +655,18 @@ geen wrap) ook voorkomt op de niet-Home-varianten van dit component
 (`PUitgaantabelKaartComponent`/`kaartTabelUitgaanComp`/
 `kaartTabelUitgaanSComp`, zie ook de P2-7-opschoonnotitie over die
 laatste twee) — bij het oppakken van deze taak even meenemen.**
+- **Bevestigde zustervondst (2026-08-09, Claude, verse stack trace):**
+  hetzelfde patroon zit ook op **`PUitgaanSliderKaartComponent`**
+  (ánder component dan de drie hierboven genoemde) — categorie-tag-
+  badge rechtsonder op de afbeelding:
+  ```
+  A RenderFlex overflowed by 2.4 pixels on the right.
+  Row:file:///.../lib/uitgaanspaginas/p_uitgaan_slider_kaart_component/p_uitgaan_slider_kaart_component_widget.dart:179:38
+  ```
+  Zelfde oorzaak (`Row` met `List.generate(categorie.length, ...)`,
+  regel 178-179, `mainAxisSize: MainAxisSize.min`, geen Wrap/Expanded).
+  Kleiner overflow (2.4px, minder zichtbaar dan Home's 113px) maar
+  zelfde onderliggende bug — zelfde fix-aanpak (Wrap i.p.v. Row).
 - **Poging door Claude (2026-08-09), geblokkeerd — geen wijziging
   aangebracht.** De juiste `Row`-node (kind `tagCategorieComponent`,
   binnen `Container` → sibling van de image-`Stack`) was betrouwbaar