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
 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
 alleen met `setsid`.** Een gewone `run_in_background`-aanroep van
 `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
 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 —
 daar hangt half het project op, en het verklaart de meeste "soms een string,
 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)
 
+⚠️ **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
 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,
@@ -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
 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
-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)