Selaa lähdekoodia

Bevinding C afgerond: sliders null-veilig via Predefined Path, offline live getest; header-observatie voor Bob

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
bob 1 päivä sitten
vanhempi
commit
ec6e0962be
2 muutettua tiedostoa jossa 91 lisäystä ja 19 poistoa
  1. 41 0
      CLAUDE.md
  2. 50 19
      TASKS.md

+ 41 - 0
CLAUDE.md

@@ -2031,6 +2031,18 @@ en achteraf `svc wifi enable` + `svc data enable`. Controleer met
 echt uit staat). **Vergeet het herstel niet** — een volgende sessie vindt anders
 echt uit staat). **Vergeet het herstel niet** — een volgende sessie vindt anders
 een emulator zonder netwerk en zoekt de fout in de app.
 een emulator zonder netwerk en zoekt de fout in de app.
 
 
+**Een losse verificatie-export (`flutterflow export-code ... --as-debug`) bevat
+GEEN afbeeldingen uit `assets/images/` (alleen `favicon.png`) — voeg
+`--include-assets` toe zodra je er een APK van wilt bouwen.** Bevestigd
+2026-09-13: een testbuild zonder die vlag toonde op Home een egaal **grijs
+blok** op de plek van de slider, precies het beeld van de bekende
+offline-crash — maar de log was schoon. Het was `Image.asset('assets/images/
+logo800px.png')` (de lege-lijst-fallback) die op een ontbrekend bestand
+stukliep; in een profile-build is dat net zo stil en net zo grijs als een
+echte crash. `ff-run-fvm.sh` geeft die vlag wél mee, vandaar dat het daar
+nooit opviel. Snelle check vóór je bouwt: `ls <exportmap>/assets/images/`
+moet meer dan `favicon.png` bevatten, anders kopieer je ze uit de projectmap.
+
 **Een APK bouwen vanuit een losse exportmap overleeft een achtergrond-Bash-call
 **Een APK bouwen vanuit een losse exportmap overleeft een achtergrond-Bash-call
 alleen met `setsid`.** Een gewone `run_in_background`-aanroep van
 alleen met `setsid`.** Een gewone `run_in_background`-aanroep van
 `fvm flutter build apk` meldt "exit 0" terwijl Gradle nog draait, en laat geen
 `fvm flutter build apk` meldt "exit 0" terwijl Gradle nog draait, en laat geen
@@ -2044,6 +2056,35 @@ en daarna in een aparte call wachten met
 minuten. Installeren met `adb install -r`; dat is los van `flutter run` en
 minuten. Installeren met `adb install -r`; dat is los van `flutter run` en
 verstoort dus geen draaiende sessie van iemand anders.
 verstoort dus geen draaiende sessie van iemand anders.
 
 
+**Een lijstwidget null-veilig maken tegen een mislukte API-call, zónder custom
+action: Predefined Path `items` = `$[:]` (Is List) op de call, en Generate
+Dynamic Children daaraan binden.** Bevestigd 2026-09-13 (bevinding C, Home- en
+P-Uitgaan-slider). Een Backend Query + Generate Dynamic Children met JSON Path
+`$` genereert `getJsonField(jsonBody, r'$').toList()`, en dat crasht zodra
+`ApiManager` bij een exception `jsonBody == null` teruggeeft (grijs blok, alles
+eronder in dezelfde Column weg). Een **Predefined Path** van het type lijst
+genereert daarentegen `(XCall.items(jsonBody)?.toList() ?? [])` — null-veilig,
+en ook veilig bij een foutpagina-object en bij `[]`. De loop-items blijven
+dezelfde maps, dus de `$.veld`-bindingen erin hoeven niet aangepast.
+- **In de API-call:** Response & Test → "Add JSON Path" → pad `$[:]`, naam
+  `items` → type-knop ("Anything") → **Is List** aan → Update. Je hoeft géén
+  "Test API Call" te doen; type "Anything" + Is List volstaat en levert
+  `static List? items(...)` op.
+- **De Save-knop van dit paneel valt onder de vensterrand** en het paneel
+  scrollt niet: klap de sectie **"Preview and Test"** in (chevron rechts),
+  dan staat Save/Cancel in beeld. Zonder die Save meldt de header wel
+  "Saved" maar komt er niets in de export. Reken op **twee** Save-klikken
+  direct na een Update-dialoog; de eerste landt vaak niet (knop blijft
+  blauw — zoom om te checken dat hij grijs is).
+- **"Add JSON Path" schuift na elke klik omlaag** — klik 'm één keer,
+  screenshot, en typ pas daarna in de nieuwe rij. Drie kliks-in-één-batch
+  leverden vier lege `$`-rijen op (Cancel maakt dat ongedaan).
+- **In het widget:** Generate Dynamic Children → klik op de **Value-tekst**
+  zelf (het potlood rechts reageert niet) → Available Options **Predefined
+  Path** → Predefined Path Name `items` → Confirm → **Save** in het
+  rechterpaneel. Klik de dropdowns op hun **chevron**; een klik op de tekst
+  sloot een keer de hele dialoog.
+
 **`getJsonField` geeft bij ÉÉN match de waarde zelf en bij MEERDERE een lijst —
 **`getJsonField` geeft bij ÉÉN match de waarde zelf en bij MEERDERE een lijst —
 daar hangt half het project op, en het verklaart de meeste "soms een string,
 daar hangt half het project op, en het verklaart de meeste "soms een string,
 soms een lijst"-verrassingen.** De implementatie staat in
 soms een lijst"-verrassingen.** De implementatie staat in

+ 50 - 19
TASKS.md

@@ -2,6 +2,20 @@
 
 
 ### 🔧 Verbindingsmelding in de header — Eigenaar: Bob — bezig (2026-09-13)
 ### 🔧 Verbindingsmelding in de header — Eigenaar: Bob — bezig (2026-09-13)
 
 
+⚠️ **Observatie Claude 2026-09-13 ±20:08 (verse export van 20:02, profile-build
+op de telefoon-emulator): de header is volledig LEEG — geen hamburger, geen
+logo, online én offline.** `home_widget.dart` is byte-identiek aan de
+nulmeting; alleen `header_buttons_component_widget.dart` verschilt: de oude
+`Align > Row` zit nu in een `Column(mainAxisSize: max)` met daaronder een
+`SizedBox(200×40) > VerbindingsBanner`. Vermoedelijke oorzaak: in die Column
+krijgt de Row een **onbegrensde hoogte** (Home zet het component als
+`FlexibleSpaceBar.background` in een `PreferredSize(50)`-AppBar), en met het
+200×200-logo erin gaat dat in een profile-build stil op zwart. Geen fout in
+`logcat`, `dart analyze` 0 errors — het is een layout-exceptie tijdens de
+build. Suggestie: Column op **Main Axis Size = Min**, en de Row een vaste
+hoogte geven (of het logo begrenzen); daarna even op een toestel kijken.
+Kan ook zijn dat dit een tussenstand is die je al gezien hebt.
+
 Bob's keuze 2026-09-13: niet elke pagina aanpassen, maar **één melding in de
 Bob's keuze 2026-09-13: niet elke pagina aanpassen, maar **één melding in de
 header**, gevoed door een App State-vlag die de app zelf zet. Claude heeft de
 header**, gevoed door een App State-vlag die de app zelf zet. Claude heeft de
 custom code geschreven en live getest op emulator-5556 (eigen profile-build,
 custom code geschreven en live getest op emulator-5556 (eigen profile-build,
@@ -95,26 +109,43 @@ blok ís de gecrashte widget (bevinding C hieronder). De banner maakt het alleen
 verklaarbaar in plaats van kapot. De vier crashplekken blijven dus een aparte
 verklaarbaar in plaats van kapot. De vier crashplekken blijven dus een aparte
 taak.
 taak.
 
 
-### 🛠 Bevinding C · offline-crash op Home/P-Uitgaan-slider — Eigenaar: Claude — bezig (2026-09-13 20:10, Bob akkoord)
-
-Aanpak: geen herbouw naar custom action, maar een **Predefined Path** op de
-API-call (`items` = `$[:]`, is-list) en Generate Dynamic Children daaraan
-binden. FlutterFlow genereert dan `XCall.items(jsonBody)?.toList() ?? []` —
-null-veilig, in tegenstelling tot `getJsonField(jsonBody, r'$').toList()`.
-Plekken: `HomeSliderCall` (Home-slider), `UitgaanSliderCall` (P-Uitgaan-slider),
-`HorecagelegenheidoverzichtCall` (horeca tab 6 — herbinding daar is voor Bob,
-Claude komt niet in dat paneel op die pagina).
-**Stand 20:05:** de drie `items`-paths staan erin (exportgeverifieerd, 3×
-`static List? items`), nog nergens gebruikt. De herbinding van Generate Dynamic
-Children is NIET gedaan — Bob meldde dat hij zelf aan de offline-crash bezig is
-(verbindingscheck); Bob gaf 20:10 akkoord om dit ernaast te doen.
+### ✅ Bevinding C · offline-crash op Home/P-Uitgaan-slider — AFGEROND 2026-09-13 (Claude, builder + live offline-test); restpunt tab 6 voor Bob
+
+**Wat er gedaan is (exportgeverifieerd, `dart analyze` 0 errors):**
+- Op `HomeSlider`, `UitgaanSlider` en `Horecagelegenheidoverzicht` (API Calls →
+  Response & Test) een JSON Path **`items` = `$[:]`, Is List aan** toegevoegd →
+  `static List? items(dynamic response)` in `api_calls.dart`.
+- Generate Dynamic Children van de Carousel op `HomeUitgaanSliderComponent` en
+  `PUitgaanSliderComponent` herbonden naar **Predefined Path → items**. De
+  export genereert nu `(XCall.items(jsonBody)?.toList() ?? []).take(12)` in
+  plaats van `getJsonField(jsonBody, r'$').toList()` — null-veilig bij een
+  mislukte call (`jsonBody == null`), bij een foutpagina-object én bij `[]`.
+  Bij een fout toont de slider gewoon zijn bestaande lege-lijst-afbeelding en
+  blijven de tabs eronder staan; Bob's verbindingsbanner erboven zegt waarom.
+
 **Terugdraaien bij calamiteit (per component één dialoog):** Carousel
 **Terugdraaien bij calamiteit (per component één dialoog):** Carousel
-selecteren → Generate Dynamic Children (4e icoontje) → Value-icoontje → Set
-from Variable → de eigen Backend-Query-response (`HomeSlider Response` resp.
-`UitgaanSlider Response`) → Available Options **"No Further Changes"** →
-Confirm → Save. Dat is exact de oude binding; nulmeting-export van vóór alle
-wijzigingen staat in `/tmp/ff-checkN0`. De drie `items`-JSON-paths mogen
-gewoon blijven staan, die doen ongebruikt niets.
+selecteren → Generate Dynamic Children (4e icoontje) → klik op de Value-tekst
+(niet het potlood) → dialoog: Available Options **"JSON Path"** → JSON Path
+**`$`** → tweede Available Options **"No Further Changes"** → Confirm → Save
+in het rechterpaneel. Dat is exact de oude binding. Nulmeting-export van vóór
+alle wijzigingen: `/tmp/ff-checkN0`. De drie `items`-paths mogen blijven
+staan; ongebruikt doen ze niets.
+
+**Live getest op de telefoon-emulator (profile-build van de verse export,
+`svc wifi/data disable`):** geen `NoSuchMethodError` meer in de log; de slider
+toont offline het logo (lege-lijst-fallback) en de tabs eronder blijven staan
+met hún lege-staat-logo. Online: slider met kaarten, tabs gevuld, log schoon.
+⚠️ Let op bij een eigen test: een `export-code` zónder `--include-assets` mist
+`logo800px.png`, en dan zie je alsnog een grijs blok dat níét van deze bug is
+(zie `CLAUDE.md`).
+
+**Nog open, voor Bob:** `horecagelegenhedenOverzichtCurrent` tab 6 (Verhuur,
+catering), `StaggeredView` → Generate Dynamic Children → zelfde herbinding
+naar **Predefined Path → items** (de path staat al op de call). Dat paneel
+schrijft in Claude's browser op die pagina niet weg. De zes treffers op
+`horecagelegenhedenOverzichtProvinciePage` en die op
+`SliderUitgaanComponentSmallCurrent` blijven bewust liggen: geen enkele knop
+navigeert daarheen / nul gebruikers.
 
 
 ### 🐞 Nieuw gevonden 2026-09-13 (Claude, code-audit op verse export)
 ### 🐞 Nieuw gevonden 2026-09-13 (Claude, code-audit op verse export)