|
@@ -2398,6 +2398,75 @@ sessie:** nieuwe App State-velden/Constants zijn voor Claude niet
|
|
|
zelfstandig toe te voegen — na 1-2 pogingen overdragen aan Bob met
|
|
zelfstandig toe te voegen — na 1-2 pogingen overdragen aan Bob met
|
|
|
exacte veldnaam+type-specificatie (kost hem seconden per veld).
|
|
exacte veldnaam+type-specificatie (kost hem seconden per veld).
|
|
|
|
|
|
|
|
|
|
+**Een Drupal Services views-JSON leidt zijn sleutelnaam af van het
|
|
|
|
|
+views-LABEL, niet van de veldnaam — en dat is een veelgemaakte bron van
|
|
|
|
|
+"waarom is dit veld altijd null".** Bevestigd 2026-09-04: de app las
|
|
|
|
|
+`$[:].bezorgdin` terwijl de respons `bezorgtin` heet, omdat het label van
|
|
|
|
|
+`field_hor_bez_bezorgd_in_1` in de view op `Bezorgtin` (met een **t**)
|
|
|
|
|
+staat. `getJsonField` geeft dan gewoon `null` en de widget toont op élke
|
|
|
|
|
+node de tekst "null" — dus niet alleen bij lege data, wat het makkelijk
|
|
|
|
|
+laat verwarren met een ontbrekende Visibility-guard. **Vuistregel bij
|
|
|
|
|
+een veld dat altijd leeg blijft: haal één record met echte data op
|
|
|
|
|
+(`curl ... | jq`) en vergelijk de sleutelnamen letterlijk**, in plaats
|
|
|
|
|
+van de veldnaam uit Drupal over te nemen.
|
|
|
|
|
+
|
|
|
|
|
+**Een views-veld van het type "All taxonomy terms" of een multi-value
|
|
|
|
|
+referentie komt als LIJST binnen, en `.toString()` daarop geeft
|
|
|
|
|
+blokhaken.** De app toonde `[Afhaal, Bezorgen]` i.p.v. `Afhaal,
|
|
|
|
|
+Bezorgen`. FlutterFlow heeft geen ingebouwde join-transform voor een
|
|
|
|
|
+JSON-lijst (de "Available Options"-lijst kent alleen List Contains Item,
|
|
|
|
|
+Filter, Item at Index, e.d.). Gebruik de custom function
|
|
|
|
|
+**`lijstAlsTekst(dynamic items)`** die hiervoor in
|
|
|
|
|
+`custom_functions.dart` staat — die is bewust plat geschreven (geen
|
|
|
|
|
+`.map()`, geen lokale closure) omdat FlutterFlow's validator daarover
|
|
|
|
|
+struikelt. Let op: of een veld een lijst is zie je **niet** aan de
|
|
|
|
|
+formatter in de view-export; `taxonomy_term_reference_plain` levert een
|
|
|
|
|
+string bij single-value (`plaats`) en een lijst bij multi-value
|
|
|
|
|
+(`bezorgtin`). Alleen een echt record met data geeft uitsluitsel.
|
|
|
|
|
+
|
|
|
|
|
+**Custom Code-editor: FlutterFlow genereert de functiesignature zelf —
|
|
|
|
|
+plak alléén de body.** Bevestigd 2026-09-04: een compleet uitgeschreven
|
|
|
|
|
+functie (`String lijstAlsTekst(dynamic items) { ... }`) in het codeveld
|
|
|
|
|
+plakken levert een functie **in zichzelf** op
|
|
|
|
|
+(`String? lijstAlsTekst(...) { String lijstAlsTekst(...) { ... } }`) —
|
|
|
|
|
+de buitenste heeft dan geen `return` en geeft dus altijd `null` terug.
|
|
|
|
|
+Het glipt langs de validator (terwijl datzelfde geneste-functie-patroon
|
|
|
|
|
+elders juist "The function is empty or cannot be parsed" geeft) en komt
|
|
|
|
|
+gewoon in de export. Herstel via Cancel → "Discard new custom code?" →
|
|
|
|
|
+Yes en opnieuw beginnen; achteraf bewerken is onbetrouwbaar (zie het
|
|
|
|
|
+selectie-verwijderen-probleem elders in dit bestand).
|
|
|
|
|
+
|
|
|
|
|
+**App Settings → Initial Page: "Entry Page" is de tak voor UITGELOGDE
|
|
|
|
|
+bezoekers, "Logged In Page" die voor ingelogde.** Makkelijk te
|
|
|
|
|
+verwisselen, met een groot effect: 2026-09-04 kreeg daardoor juist de
|
|
|
|
|
+nieuwe, uitgelogde bezoeker een verplicht keuzescherm als eerste indruk.
|
|
|
|
|
+Genereert in `nav.dart` op **twee** plekken hetzelfde ternaire patroon
|
|
|
|
|
+(de `_initialize`-route én de `errorBuilder`) — controleer ze allebei.
|
|
|
|
|
+**Beide op dezelfde pagina zetten mag:** FlutterFlow toont dan "Warning:
|
|
|
|
|
+Entry Page and Logged In Page should be different", maar dat is een
|
|
|
|
|
+generiek advies, geen fout — de waarde slaat gewoon op (geverifieerd via
|
|
|
|
|
+verse export).
|
|
|
|
|
+
|
|
|
|
|
+**Emoji/4-byte tekens die als `?` in de database staan: kijk naar wat er
|
|
|
|
|
+NAAST de vraagtekens overleefde.** Blijft er een losse variatieselector
|
|
|
|
|
+(U+FE0F) of ZWJ (U+200D) staan, dan is het MySQL `utf8` (3-byte) i.p.v.
|
|
|
|
|
+`utf8mb4`: 4-byte sequenties worden bij het *opslaan* door `?` vervangen,
|
|
|
|
|
+3-byte tekens overleven. Dit raakt ook "fancy" letters uit het
|
|
|
|
|
+mathematical-alphanumeric-blok (U+1D400). De data is dan definitief weg —
|
|
|
|
|
+niets te decoderen, geen app-fix mogelijk. Snelste test of het nú nog
|
|
|
|
|
+gebeurt: een testnode met een emoji opslaan en herladen. Let op dat een
|
|
|
|
|
+tweede schrijfroute (bv. een Django-importer met een eigen
|
|
|
|
|
+databaseverbinding) zijn eigen `charset`-instelling heeft, ook al staat
|
|
|
|
|
+de kolom goed.
|
|
|
|
|
+
|
|
|
|
|
+**Bij het testen of een views-endpoint een filter-parameter accepteert:
|
|
|
|
|
+stuur altijd óók een verzonnen parameter mee als controle.** Drupal Views
|
|
|
|
|
+negeert onbekende query-parameters **stil** — zonder die controle bewijst
|
|
|
|
|
+"de resultaten veranderen niet" niets (het kan net zo goed de verkeerde
|
|
|
|
|
+parameternaam zijn). Bevestigd 2026-09-05: `onzin_param=123` gaf exact
|
|
|
|
|
+dezelfde 25 items als vijf serieuze kandidaat-filternamen, wat pas hard
|
|
|
|
|
+maakte dat er geen exposed datumfilter bestond.
|
|
|
|
|
+
|
|
|
## Domein/architectuurcontext
|
|
## Domein/architectuurcontext
|
|
|
|
|
|
|
|
- **Merk-DNA van uitgaanskrant.com (bron van waarheid voor look&feel;
|
|
- **Merk-DNA van uitgaanskrant.com (bron van waarheid voor look&feel;
|