Pārlūkot izejas kodu

TASKS.md/CLAUDE.md: P1-24-bouwpoging + performance-uitleg voor Bob

P1-24: guard-fix op HomeUitgaantabelKaartComponent geprobeerd (~45
min), geblokkeerd op een echte FlutterFlow-UI-beperking -- "Is Set
and Not Empty" niet beschikbaar voor een JSON-Path-gebonden First
Value op een ongetypeerd loop-item, geen literal-tekst-invoer voor
een 2e AND-conditie. Volledig gedocumenteerd (wat geprobeerd is, wat
niet werkte) + overgedragen aan Bob met exacte stappen voor beide
fix-locaties. Widget zelf ongewijzigd/veilig, elke poging netjes
teruggedraaid.

CLAUDE.md: nieuwe notitie over deze operator-beperking (wanneer "Is
Set and Not Empty" wel/niet beschikbaar is, afhankelijk van hoe de
First Value gebonden is).

Performance-vraag Bob (fysieke toestellen "enorm traag" na schone
herinstallatie): root cause = debug-build (universeel trager door
ontwerp), niet een kapot toestel/instelling. Nieuwe staande regel:
standaard --profile voor gewone testrondes, debug alleen bij actief
bug-jagen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
bob 3 nedēļas atpakaļ
vecāks
revīzija
0d84d6c10f
2 mainītis faili ar 110 papildinājumiem un 3 dzēšanām
  1. 32 0
      CLAUDE.md
  2. 78 3
      TASKS.md

+ 32 - 0
CLAUDE.md

@@ -707,6 +707,38 @@ laadfouten zoals 404's). Werkende fix:
   dan Default Variable Value + "Show Error Image on Failure" — sneller
   te bouwen dan ConditionalBuilder.
 
+**"Is Set and Not Empty" is niet altijd beschikbaar als operator —
+hangt af van hóe de First Value gebonden is, niet alleen van het
+onderliggende veldtype.** Bevestigd 2026-08-21 (Claude, ~45 min
+vastgelopen op `HomeUitgaantabelKaartComponent`'s `$.logo`-guard,
+zie `TASKS.md` P1-24): een First Value gebonden via **JSON Path** op
+een raw loop-item (bv. `evenementenItem` uit "Generate Dynamic
+Children", geen gekoppeld Custom Data Type) krijgt in de builder-UI
+het type-label **"Json"**, en voor dat type biedt de operator-lijst
+alleen `Equal To`/`Not Equal To`/`Is Set`/`Is Not Set` — **"Is Set and
+Not Empty" ontbreekt gewoon**, ook al is de onderliggende waarde
+gewoon een String. Uitgeprobeerd en allemaal doodgelopen: (1) een 2e
+AND-conditie met `!= ''` toevoegen — de "Second Value"-picker biedt
+voor een Json-typed vergelijking **geen vrij tekstveld**, alleen een
+variabele-bronkiezer (geen "literal"-optie, ook niet via de
+zoekbalk-truc); (2) de First Value ombuigen naar "Predefined Path"
+i.p.v. "JSON Path" in de hoop op een String-type — werkt alleen als
+de bron een echt Custom Data Type heeft (raw JSON-loop-items hebben
+dat per definitie niet, dus de path-kiezer toont dan gewoon niets);
+(3) een "empty"/"length"-transform zoeken in de 2e "Available
+Options"-dropdown (naar analogie van de bekende `List Contains
+Item`-truc) — alleen "To Data Type" (custom models) en "No Further
+Changes" beschikbaar. **Vuistregel:** "Is Set and Not Empty" werkt
+betrouwbaar op een **directe component-parameter** die zelf al als
+String gedeclareerd is (zie het bekende P0-8-recept — dat blijft
+gewoon correct), maar **niet** op een JSON-Path-binding tegen een
+raw/ongetypeerd loop-item. Bij zo'n loop-item-guard: of eerst het
+component-parameter zelf String-typeren (als het als parameter
+doorgegeven wordt aan een sub-component), of het probleem als "Is
+Set" (null-check alleen) accepteren en de restkans op een lege-string-
+`.toString()` → letterlijke `"null"`-tekst als cosmetisch, lager-
+risico restpunt behandelen (P1-1's precedent) i.p.v. een crash.
+
 **Patroon: "Is Set and Not Empty"-conditie tegen een
 Default-Value/`valueOrDefault`-gebonden veld is een no-op — en kan een
 crash verbergen.** Bevestigd 2026-08-07

+ 78 - 3
TASKS.md

@@ -38,6 +38,30 @@ nieuw onderzoek naar P1-24/P1-25.
    Geen tijd meer gehad om `emulator-5554` na de crash opnieuw te
    proberen of `emulator-5556`/het fysieke toestel in te zetten voor
    P1-25 — blijft open voor een volgende sessie.
+5. **Performance-vraag van Bob** (fysieke testtoestellen "enorm traag"
+   ná een schone herinstallatie): geen kapot toestel/instelling
+   gevonden (Developer Options normaal, geen achtergrondbelasting) —
+   bleek gewoon een **debug-build** (`dumpsys package` toonde
+   `DEBUGGABLE` op beide telefoons, universeel en met opzet trager dan
+   een release/profile-build). **Nieuwe staande regel, vastgelegd in
+   `CLAUDE.md`:** voortaan standaard `fvm flutter run --profile -d
+   <device>` voor gewone testrondes, volledige debug-mode
+   (`ff-run-fvm.sh`) alleen nog bij het actief jagen op een specifieke
+   bug. Gedemonstreerd op `K7V8DYTSMVTW6XBI` (profile-build: 56s
+   Gradle + 3.2s install, draait probleemloos).
+6. **P1-24-bouwpoging (~45 min) mislukt, overgedragen aan Bob** — de
+   guard-fix op `HomeUitgaantabelKaartComponent` bleek geblokkeerd op
+   een echte FlutterFlow-UI-beperking (operator "Is Set and Not Empty"
+   niet beschikbaar voor een JSON-Path-gebonden First Value op een
+   ongetypeerd loop-item, geen letterlijke-tekst-invoer voor een 2e
+   AND-conditie) — zie de uitgebreide poging-documentatie bij P1-24
+   hieronder + nieuwe `CLAUDE.md`-notitie. Widget zelf staat nog
+   ongewijzigd/veilig (elke poging netjes teruggedraaid via Cancel/
+   page-reload, geverifieerd). **Bijvangst:** de 2e P1-24-locatie
+   (`PUitgaanSliderKaartComponent`'s `Image.network`) is juist
+   waarschijnlijk wél eenvoudig, want die `logo` is daar een directe
+   String-component-parameter, niet een JSON-Path-binding — apart
+   genoteerd voor Bob.
 
 **Vorige sessie (2026-08-20, laat, look&feel-review mobiel+tablet,
 code-only + live emulators `emulator-5554`/`emulator-5556`, geen
@@ -905,7 +929,8 @@ losse P1-taak; de resterende mysterie-crash staat nu apart als
   `launchURL()` aan met de kale placeholder-string als URL (geen geldig
   schema/host → crash).
 
-**P1-24 · Eigenaar: Onbepaald.** **Root cause definitief gevonden
+**P1-24 · Eigenaar: Bob (builder-fix geblokkeerd op een operator-
+beperking, zie hieronder).** **Root cause definitief gevonden
 2026-08-21 (Claude, sessie 42, na de P0-9-fix live herbevestigd) — de
 P0-9-link uit de oude analyse hieronder klopte niet.** Live op verse
 `flutter run -d emulator-5554` (dus mét `services_3`-fix) trad de
@@ -942,8 +967,58 @@ LEUK"-kaart in de Home-carousel) i.p.v. de app te laten crashen. Wel
 een echte visuele bug (fout icoon i.p.v. foto) en genereert bij elke
 page-load een burst van ~40-65 "Failed to decode image"-regels in
 logcat (native `ImageDecoder`-fouten, niet zomaar onschuldig — zie de
-kanttekening bij P1-25 hieronder). **Nog niet gebouwd** — mechanische
-fix, klaar voor een volgende builder-sessie.
+kanttekening bij P1-25 hieronder).
+
+**⚠️ Bouwpoging mislukt, overgedragen aan Bob (2026-08-21, Claude,
+sessie 42, ~45 min geprobeerd op widget 2 alleen).** Het probleem: de
+bestaande guard is gebonden via **JSON Path** (`$.logo`, type "Json"),
+en voor dat type biedt de Single-Condition-operator-lijst alleen
+`Equal To`/`Not Equal To`/`Is Set`/`Is Not Set` — **geen**
+"Is Set and Not Empty" (die operator bestaat kennelijk alleen voor
+een écht String-getypeerde binding). Geprobeerd en allemaal
+doodgelopen:
+- Een 2e conditie toevoegen (AND, `$.logo != ''`) via "Add Condition"
+  → "Conditions" → "Single Condition" (moest via de zoekbalk-truc
+  gevonden worden, zie CLAUDE.md) — de First Value van die 2e conditie
+  liet zich wel op `$.logo` binden, maar er bleek **geen manier om een
+  letterlijke lege string `''` als Second Value in te vullen**: de
+  "Second Value → Value"-picker biedt alleen een variabele-bronkiezer
+  (Component Parameters/evenementenItem/Authenticated User/Global
+  Properties/App State), geen vrij tekstveld, en zoeken op "literal"
+  binnen die picker geeft 0 resultaten.
+- First Value omzetten naar **String** via "Predefined Path" i.p.v.
+  "JSON Path" (in de hoop dat dat wél "Is Set and Not Empty" oplevert)
+  — `evenementenItem` heeft geen gekoppeld Custom Data Type/schema
+  (het is een raw JSON-loop-item via Generate Dynamic Children), dus
+  "Predefined Path" toont domweg geen enkel veld om te kiezen.
+- Een "empty"/"length"-transform zoeken onder de JSON-Path-binding se
+  eigen 2e "Available Options"-dropdown (zoals `CLAUDE.md`'s bekende
+  `List Contains Item`-truc voor `List<String>`-checks) — alleen
+  "To Data Type" (wijst naar custom models, niet naar String) en
+  "No Further Changes" beschikbaar, niets bruikbaars.
+- Onderweg 2x per ongeluk een 2e conditie laten hangen/de pagina laten
+  herladen na een vastgelopen geneste "Set Variable"-dialoog (bekend
+  patroon, zie `CLAUDE.md`) — **geen schade**: elke keer via Cancel/
+  page-reload teruggezet naar de oorspronkelijke, werkende "IF `$.logo
+  is set`"-conditie, bevestigd via een laatste check dat de widget
+  ongewijzigd staat.
+**Voor Bob (waarschijnlijk sneller in eigen browser, of gewoon een
+andere aanpak die ik niet gevonden heb):**
+1. [HomeUitgaantabelKaartComponent](https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=widgetTree&component=HomeUitgaantabelKaartComponent) →
+   `ConditionalBuilder` (in Stack, boven `Wrap`/`tagCategorieCompo...`)
+   selecteren → rechterpaneel "First Condition" → IF-pill "`$.logo is
+   set`" aanklikken → **First Value** is al gebonden op `$.logo`
+   (evenementenItem, JSON Path) — de vraag is puur hoe je dit ombuigt
+   naar "ook niet-leeg". Mogelijk werkt het wel meteen in jouw browser
+   zonder de clipping/freeze-problemen die ik tegenkwam.
+2. [PUitgaanSliderKaartComponent](https://app.flutterflow.io/project/uitgaanskrant-1qhvtd?tab=uiBuilder&component=PUitgaanSliderKaartComponent) →
+   de `Image.network(widget!.logo!, ...)`-node (rechtsboven op de
+   kaart, regel 147-148 in de export) heeft **helemaal geen guard** —
+   Wrap Widget (Ctrl+B) → ConditionalBuilder, conditie op de rauwe
+   `logo`-component-parameter (niet JSON Path — dit is al een String-
+   parameter, dus "Is Set and Not Empty" zou hier wél gewoon
+   beschikbaar moeten zijn), Then = bestaande Image, Else = Icon
+   `image_not_supported` (zelfde patroon als elders).
 
 **P1-25 · Eigenaar: Onbepaald.** Nieuwe RenderFlex-overflow gevonden
 2026-08-15 (Claude, live launch emulator-5554): "A RenderFlex