浏览代码

132-G afgerond op 1 pagina na; tweetalig-patroon naar CLAUDE.md

TASKS: 132-G ingekort tot wat er nog ligt (ProvinciePage 6 tabs met de
teksten erbij, nieuwsbrieven-lijst, fotocarousels als eigen besluit).
De null-kaarten op MijnAanmeldingen staan nu als eigen punt 132-G2.

CLAUDE.md: het tweetalig()-patroon (custom function die via
platformDispatcher.locales bij de taal komt, non-nullable return),
LegeLijstMelding als opvolger van LegeLijstComponent, de netwerk-uit-truc
om een lege staat te testen, en dat het Issues-paneel niet scrollt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bob 1 天之前
父节点
当前提交
afbb60b225
共有 2 个文件被更改,包括 104 次插入 和 297 次删除
  1. 61 7
      CLAUDE.md
  2. 43 290
      TASKS.md

+ 61 - 7
CLAUDE.md

@@ -2329,13 +2329,13 @@ bevestigde pogingen stoppen en aan Bob vragen — geef het exacte pad
   `isEmpty`, dan lijkt een geslaagde wijziging ten onrechte mislukt.
   ⚠️ **Widget Type biedt alleen *Image* of *Component* — géén Text** (bevestigd
   2026-09-20 door Bob). Een lege lijst die moet uitleggen wáárom hij leeg is,
-  gaat dus via een component. Dat staat er sinds die datum als
-  **`LegeLijstComponent`** (`lib/shared/lege_lijst_component/`): Icon
-  `event_busy` + gecentreerde `Text` op `bodyMedium`/`secondaryText`, met één
-  **required** String-parameter `tekst`. Hergebruiken, niet opnieuw bouwen —
-  ook op de plekken waar nu nog een kaal `logo800px.png`/applogo als lege staat
-  staat. **Let op:** een parameterwaarde is een letterlijke string, geen
-  i18n-sleutel, dus zo'n melding krijgt géén globe en dus geen EN-vertaling.
+  gaat dus via een component. **Gebruik `LegeLijstMelding`**
+  (`lib/shared/lege_lijst_melding/`, sinds 2026-09-23): Icon `event_busy` +
+  gecentreerde `Text`, padding 24 rondom, en **twee** required String-parameters
+  `nlTekst` / `enTekst` — tweetalig via `tweetalig()`, zie het blok hieronder.
+  Hergebruiken, niet opnieuw bouwen. Het oudere `LegeLijstComponent` (één
+  parameter `tekst`, eentalig) staat er nog voor 4 plekken op `mijnProfiel`;
+  niet meer gebruiken voor nieuw werk.
 - **Recept dat 2026-09-22 in één ronde werkte (op een `GridView`):** widget
   selecteren → Styling-tab → eigenschappen-filter `Empty` → **Show Empty List
   Widget** aan → filter wissen (anders verbergt het de vervolgopties, wat eruitziet
@@ -2345,6 +2345,60 @@ bevestigde pogingen stoppen en aan Bob vragen — geef het exacte pad
   label "Parameters") → **Center Component** aan. Export:
   `return LegeLijstComponentWidget(tekst: '…');`
 
+**Tweetalige tekst op een plek waar de globe niet kan komen: de custom function
+`tweetalig(nlText, enText)`.** Bedacht en bewezen 2026-09-23. Een
+component-*parameterwaarde* is een letterlijke string, dus die krijgt geen
+i18n-sleutel en geen Engelse vertaling. Een custom **function** kan wél bij de
+taal — ook zonder `BuildContext`:
+
+```dart
+String tweetalig(String nlText, String enText) {
+  final locales = WidgetsBinding.instance.platformDispatcher.locales;
+  for (final l in locales) {
+    if (l.languageCode == 'en') { return enText; }
+    if (l.languageCode == 'nl') { return nlText; }
+  }
+  return nlText;
+}
+```
+
+- **`WidgetsBinding` komt via de `material.dart`-import die FlutterFlow standaard
+  in `custom_functions.dart` zet** — geen extra import nodig (en het import-blok
+  van een custom function is toch niet bewerkbaar). Geverifieerd met
+  `dart analyze` in een verse exportmap: 0 errors.
+- **De fallback klopt met Flutter zelf:** bij een niet-ondersteunde systeemtaal
+  valt Flutter terug op `supportedLocales.first`, en dat is hier `Locale('nl')`
+  (`app.dart:150` in de SDK). Vandaar `return nlText` als sluitstuk.
+- ⚠️ **Return-type String met *Nullable* UIT, en beide argumenten ook
+  non-nullable.** Bij `String?` eist FlutterFlow een "Default Variable Value", en
+  `valueOrDefault` substitueert die óók bij een lege string. Met non-nullable
+  komt er een kale `functions.tweetalig(a, b)` in de export, zonder wrapper.
+- **Patroon:** zet de functie één keer in een component (Text-waarde → bind aan
+  `tweetalig`, argumenten → de twee component-parameters). Elke gebruiksplek
+  vult daarna alleen twee letterlijke strings in het parameterpaneel in — dat is
+  makkelijk klikwerk, en de fragiele Set-Variable-dialoog komt maar één keer voor.
+- **Prijs:** deze teksten staan niet in `internationalization.dart`, dus geen
+  globe en geen vertaalaudit. Daar staat tegenover dat NL en EN op één regel in
+  de export staan: `grep -rn "functions.tweetalig(" lib/ --include=*.dart` toont
+  beide talen naast elkaar.
+- 💡 **Een component-parameter HERNOEMEN behoudt zijn bindingen.** `tekst` →
+  `nlTekst` liet de bestaande Text-binding intact; dat scheelt een fragiele
+  herbouw. Zelfde truc als bij een page-state-veld.
+
+**Een lege lijst forceren om de lege staat te testen, zonder in te loggen: zet
+het netwerk uit.** `adb shell svc wifi disable` + `svc data disable`, dan de
+pagina via een deep link starten. Werkt zolang de paging-binding
+`(getJsonField(..., r'$') ?? []).toList()` is (JSON Path `$`) — die geeft bij een
+mislukte call netjes `[]`. Vergeet `svc wifi enable` achteraf niet.
+⚠️ *Uitgelogd* navigeren werkt niet als test: een endpoint dat anoniem een
+foutmelding-array teruggeeft, rendert die als lijst-met-items (zie 132-G2 in
+`TASKS.md`).
+
+**Het Issues-paneel scrollt niet.** Het toont vier regels en blijft daarbij, ook
+met muiswiel — bij 69 warnings zie je er dus vier. Wil je weten of een teller
+door jouw werk is opgelopen: noteer hem vóór je begint en vergelijk, dat is
+betrouwbaarder dan de lijst proberen te lezen.
+
 **⚠️ Een blok verbergen met een Visibility-conditie op het KIND laat de lege
 ruimte van de ouder staan — zet de conditie op de Container met de vaste
 hoogte.** Bevestigd 2026-09-22 op het fotoboek-blok: de conditie stond op de

+ 43 - 290
TASKS.md

@@ -554,308 +554,61 @@ De labels eten de ruimte op die de responsive `Max Lines` veronderstelt. Bij é
 label klopt het wel. Overweeg de labels op één regel te begrenzen, of de
 omschrijving één regel korter.
 
-### 132-G · Lege lijst toont een logo i.p.v. een melding · Eigenaar: **Claude** (2026-09-23: FASE 1 AF EN OP TOESTEL BEWEZEN — fase 2 kan beginnen)
-
-#### ✅ Fase 1 volledig af (2026-09-23), inclusief toesteltest
-
-- **Custom function `tweetalig(nlText, enText)`** staat er — beide argumenten
-  non-nullable String, return String met *Nullable* uit. Export regel 562 van
-  `custom_functions.dart`.
-- **Component `LegeLijstMelding`** (`lib/shared/lege_lijst_melding/`) —
-  gedupliceerd van `LegeLijstComponent`, parameters `nlTekst` + `enTekst` (beide
-  required String). De Text-binding werd `functions.tweetalig(widget!.nlTekst!,
-  widget!.enTekst!)` — **zonder `valueOrDefault`-wrapper**, precies zoals
-  bedoeld bij een non-nullable return.
-  - 💡 *Een component-parameter HERNOEMEN behoudt de binding:* `tekst` →
-    `nlTekst` liet de bestaande Text-binding intact, dus die hoefde niet opnieuw.
-- **Proefplek `MijnAanmeldingen`** — `StaggeredView` → Empty List Widget →
-  Widget Type *Component* → `LegeLijstMelding`, Center Component aan.
-  Export regel 211-217; de apostrof in "haven't" is netjes geëscaped.
-- `dart analyze` op de verse export: **0 errors**.
-
-- **Horizontale padding toegevoegd** op de Column van het component (nu
-  `EdgeInsets.fromSTEB(24, 24, 24, 24)`, paneel toont *Symmetric (24, 24)*) —
-  zonder die padding plakt een lange Engelse regel tegen beide schermranden.
-  Geldt meteen voor alle toekomstige plekken.
-
-**✅ Toesteltest geslaagd** (x64-release-APK op `emulator-5554`, telefoon):
-NL toont *"Je hebt nog geen komende evenementen of activiteiten aangemaakt."*,
-EN toont *"You haven't created any upcoming events or activities yet."* — dus
-`tweetalig` kiest de juiste tak. Emulator daarna hersteld (netwerk aan, locale
-terug op `nl-NL`).
-
-💡 **Recept om een lege staat te forceren zonder in te loggen:** zet het netwerk
-uit (`svc wifi disable` + `svc data disable`) en start de pagina via een deep
-link. De paging-binding van `MijnAanmeldingen` is `(getJsonField(..., r'$') ??
-[]).toList()`, dus een mislukte call geeft netjes `[]` → de lege-lijst-widget.
-*Uitgelogd* werkt **niet** als test — zie de bug hieronder.
-
-⚠️ **BIJVANGST-BUG (nieuw, niet in scope van 132-G): `MijnAanmeldingen` toont
-uitgelogd vier kaarten met "null".** Het endpoint geeft anoniem een
-foutmelding-array terug, en die wordt als lijst-met-items gerenderd: vier witte
-kaarten met 3× `null` en een Kopie-knop. Gemeten 2026-09-23 op een release-APK
-na `pm clear`. Hoort een lege staat of een inlog-uitnodiging te zijn.
-
-⚠️ **Niet van ons:** de Issues-teller stond op 5 errors bij aanvang en ging naar 7
-tijdens deze sessie — dubbele *Upload Data action*-namen op `ButtonLogo`/
-`ButtonFotos` (het bekende `Duplicate Page`-patroon, van de fotoboek-sessie).
-`export-code` slaagt er gewoon mee, maar ze horen opgeruimd.
-
-#### Het oorspronkelijke besluit
-
-#### ✅ BESLUIT 2026-09-23 (Bob): route A, maar met een custom FUNCTION — geen custom widget
-
-Het uitgangspunt "custom widget" bleek niet nodig. Een custom **function** kan wél bij
-de taal, ook zonder `BuildContext`:
+### 132-G · Lege lijsten: melding i.p.v. logo — **grotendeels AF**, 1 pagina te gaan
 
-```dart
-String tweetalig(String nlText, String enText) {
-  final locales = WidgetsBinding.instance.platformDispatcher.locales;
-  for (final l in locales) {
-    if (l.languageCode == 'en') { return enText; }
-    if (l.languageCode == 'nl') { return nlText; }
-  }
-  return nlText;
-}
-```
-
-- **Getest, niet aangenomen:** `WidgetsBinding` komt via de `material.dart`-import die
-  FlutterFlow standaard in `custom_functions.dart` zet — `dart analyze` in een verse
-  exportmap gaf **0 errors**, geen extra import nodig (en het import-blok van een
-  custom function is toch niet bewerkbaar).
-- **De fallback klopt met Flutter zelf:** bij een niet-ondersteunde systeemtaal valt
-  Flutter terug op `supportedLocales.first`, en dat is `Locale('nl')` (nagekeken in
-  `app.dart:150` van de SDK). Vandaar `return nlText` als sluitstuk.
-- **Waarom dit beter is dan een custom widget:** de melding blijft een gewone
-  FlutterFlow-`Text`, dus alle styling blijft in de builder aanpasbaar. Bij een custom
-  widget zou die naar Dart verhuizen.
-- ⚠️ **Return-type: String met *Nullable* UIT.** Bij `String?` eist FlutterFlow een
-  "Default Variable Value", en `valueOrDefault` substitueert die óók bij een lege
-  string.
-- **Prijs:** deze teksten komen niet in `internationalization.dart`, dus geen globe en
-  geen vertaalaudit. Daar staat tegenover dat NL en EN op één regel in de export staan:
-  `grep -rn "functions.tweetalig(" lib/ --include=*.dart` toont beide talen naast
-  elkaar, wat een diff tussen twee bestanden vervangt.
-
-**Bouwen, eenmalig:**
-1. Custom function `tweetalig` (body hierboven).
-2. Nieuw component **`LegeLijstMelding`** — dupliceer `LegeLijstComponent` (Icon + Text
-   staan dan al goed), geef het twee **required** String-parameters `nlTekst` /
-   `enTekst`, en bind de Text-waarde één keer aan `tweetalig(nlTekst, enTekst)`.
-
-Het bestaande `LegeLijstComponent` blijft ongemoeid staan met zijn vier plekken op
-`mijnProfiel` — bewust gefaseerd, zodat er niets breekt en we per plek overschakelen.
-**Per gebruiksplek daarna alleen nog:** Empty List Widget → Widget Type *Component* →
-`LegeLijstMelding` → twee letterlijke strings in het parameterpaneel. Dat is het
-makkelijke klikwerk; de fragiele Set-Variable-dialoog komt maar één keer voor (stap 2).
-
-**Fasering:**
-
-| Fase | Wat | Omvang |
-|---|---|---|
-| 1 | Functie + component + **één** proefplek (`MijnAanmeldingen`) + EN-test op toestel | eenmalig |
-| 2 | De 4 evenementen-plekken (Home-tabs, Home-slider, PUitgaan-lijst, PUitgaan-slider) | 4× |
-| 3 | Horeca: overzicht Current (6) + ProvinciePage (6) + `thuisBezorgen` (1) | 13× |
-| 4 | Later: Favorieten tab 1-3 (hebben nu géén lege staat) + de 4 bestaande `mijnProfiel`-plekken omzetten | optioneel |
-
-EN-test na fase 1:
-`adb shell cmd locale set-app-locales com.uitgaanskrant.app --locales en-US` (daarna
-terug naar `nl-NL`).
-
-#### ✅ STAND 2026-09-23 — volledige audit van ALLE lijsten in levende code
-
-Niet meer alleen "waar staat een logo", maar elke `PagedMasonryGridView` /
-`MasonryGridView` / `ListView.builder` / `CarouselSlider` in bereikbare code,
-afgezet tegen wat hij bij leeg toont. Dat leverde meer op dan de eerste
-inventaris, die alleen op logo's zocht.
-
-**Klaar: 15 instanties `LegeLijstMelding`**, alle met beide talen gevuld,
-`dart analyze` 0 errors.
-
-**1 · Nog te doen — `HorecagelegenhedenOverzichtProvinciePage`, 5 van de 6 tabs · Eigenaar: Bob (besluit 2026-09-23)**
-Stand 2026-09-23 (Claude, export-geverifieerd): **tab 4 (Overnachten) staat**, met de
-juiste NL/EN-tekst. Tab 1, 2, 3, 5 en 6 staan nog op `logo800px`. Claude kwam
-niet verder: bij de zoom van het Chrome-venster toont de gefilterde boom maar
-drie van de zes tabs en scrollt niet, en de eerste poging landde daardoor op de
-verkeerde tab (inmiddels gecorrigeerd). **Exacte stappen per tab, in je eigen
-browser (5×):**
-1. Pagina openen → Widget Tree → zoekveld `StaggeredView` → de boom toont zes
-   `StaggeredView`-rijen in **tabvolgorde** (1 Activiteiten · 2 Cultuur ·
-   3 Eetgelegenheden · 4 Overnachten ✅ · 5 Uitgaan · 6 Verhuur). Klik de rij.
-2. Rechterpaneel → "Search properties..." → `Widget Type` → dropdown staat op
-   *Image* → kies **Component**.
-3. Zoekfilter → `Component` → knop **Select Component** → zoek
-   `LegeLijstMelding` → aanklikken. *Center Component* staat dan al aan.
-4. Zoekfilter → `Parameter` → rij **nlTekst** openklappen → Value → NL-tekst
-   uit de tabel in blok B hieronder → rij **enTekst** → Value → EN-tekst.
-   (Toggle "Show Empty List Widget" staat op deze pagina al aan; niets aan doen.)
-5. Controle in één keer, op een verse export:
-   `grep -c logo800px lib/horecagelegenhedenoverzicht/horecagelegenheden_overzicht_provincie_page/*_widget.dart`
-   hoort op **0** uit te komen, en
-   `grep -n "nlTekst:" -A1 <zelfde bestand>` toont de zes teksten in tabvolgorde.
- Zelfde zes tabs in dezelfde volgorde als
-`...OverzichtCurrent`, dus de teksten uit blok B zijn één-op-één te hergebruiken
-(Bob koos voor tab 3-6 de korte variant *"Geen gelegenheden gevonden..."* /
-*"No places found..."*). Filter de tree op `StaggeredView` → zes in tabvolgorde.
-Bereikbaar via de drawer onder **Provincie**.
-
-**2 · Nieuw gevonden — `mijnProfiel`, tab Nieuwsbrieven**
-De `ListView` op `NieuwsbrievenCall` (regel ~2243) heeft **geen** lege staat;
-gebouwd in taak 128. Voorstel: *"Er zijn op dit moment geen nieuwsbrieven."* /
-*"There are no newsletters at the moment."*
-
-**3 · Andere categorie: drie FOTOcarousels, geen lijsten**
-Een tekstmelding in een beeldcarousel is discutabel — eigen besluit, niet
-automatisch meenemen:
-- `HorecagelegenheidCurrent` (~r266) — foto's van de zaak, toont nu een logo
-- `EvenementHorecagelegenheid` (~r1084) — toont niets
-- `EventCurrent` (~r241) — toont niets
-
-**4 · Werkt al, alleen niet tweetalig: 4× het oude `LegeLijstComponent`**
-op `mijnProfiel` (+1 in `FotoboekGridComponent`). Die tonen gewoon Nederlandse
-tekst; omzetten naar `LegeLijstMelding` kan later, is geen bug.
-
-**Wezen — niet doen:** `evenement_component` (hangt aan de pagina `Event`,
-0 aanroepers) en `SliderUitgaanComponentSmallCurrent` (0 aanroepers).
-
-*Gecorrigeerd 2026-09-23 door Claude:* op `...OverzichtCurrent` tab 4
-(**Overnachten**, `horcat 17965`) stond de Nederlandse tekst óók in het
-`enTekst`-veld; nu *"No places found..."*.
-
-⚠️ **Kleine inconsistentie, geen bug:** *Center Component* staat op de
-horeca-tabs **uit** en op `MijnAanmeldingen` **aan**.
-
-#### 📋 WERKLIJST — alle plekken + de tekst per plek (gemeten 2026-09-23)
-
-20 instellingen te gaan (`MijnAanmeldingen` is al gedaan). Per plek: node
-selecteren → Styling → filter `Empty` → toggle → filter **wissen** → sectie
-*Empty List Widget* → Widget Type **Component** → `LegeLijstMelding` → de twee
-teksten → *Center Component* aan.
+Het component **`LegeLijstMelding`** (`lib/shared/lege_lijst_melding/`) vervangt
+overal het kale `logo800px.png`. Het is tweetalig via de custom function
+`tweetalig(nlText, enText)` — zie `CLAUDE.md` voor dat patroon.
 
-**A · Vier componenten — één instelling dekt alle tabs die hem gebruiken**
+**Stand (geverifieerd met een verse export, `dart analyze` 0 errors):**
+15 instanties, alle met NL én EN gevuld — Home-tabs, beide sliders,
+PUitgaanPage, `horecagelegenhedenOverzichtCurrent` (6 tabs), `thuisBezorgen`,
+`MijnAanmeldingen`, Favorieten (3 tabs). NL- en EN-tak zijn op een release-APK
+bewezen.
 
-| # | Component | Dekt | nlTekst / enTekst |
-|---|---|---|---|
-| A1 | `HomeUitgaantabelKaartComponent` | **alle 5 Home-tabs** (Uitgaan, Activiteiten, Cultuur & Info, Films, Jeugd) | Er staat hier nog niets gepland. Probeer een andere datum of categorie. / Nothing is planned here yet. Try another date or category. |
-| A2 | `PUitgaantabelKaartComponent` | `PUitgaanPage` (alle categorieën) | Geen evenementen gevonden. Probeer een andere datum of zoekterm. / No events found. Try another date or search term. |
-| A3 | `HomeUitgaanSliderComponent` | Home-slider (**Carousel**) | Op dit moment niets uitgelicht. / Nothing featured right now. |
-| A4 | `PUitgaanSliderComponent` | PUitgaan-slider (**Carousel**) | Op dit moment niets uitgelicht. / Nothing featured right now. |
-
-⚠️ A3/A4 zijn Carousels; de toggle staat daar al aan (er staat een Image), maar
-`CLAUDE.md` meldt die sectie als voor Claude onbereikbaar — mogelijk Bob-werk.
-
-**B · Horeca-overzicht — 6 tabs × 2 pagina's = 12 instellingen, 6 teksten**
-
-Beide pagina's (`horecagelegenhedenOverzichtCurrent` en
-`HorecagelegenhedenOverzichtProvinciePage`) hebben **dezelfde zes tabs in
-dezelfde volgorde**, dus dezelfde tekst kan twee keer gebruikt worden. Filter de
-tree op `StaggeredView`: dan staan ze in documentvolgorde = tabvolgorde.
-
-| Tab (volgorde) | `horcat` | nlTekst / enTekst |
-|---|---|---|
-| 1 Activiteiten | 17969 | Geen activiteiten gevonden. Probeer een andere categorie. / No activities found. Try another category. |
-| 2 Cultuur | 17963 | Geen culturele gelegenheden gevonden. Probeer een andere categorie. / No cultural venues found. Try another category. |
-| 3 Eetgelegenheden | 34 | Geen eetgelegenheden gevonden. Probeer een andere categorie. / No places to eat found. Try another category. |
-| 4 Overnachten | 17965 | Geen overnachtingen gevonden. Probeer een andere categorie. / No places to stay found. Try another category. |
-| 5 Uitgaan | 17967 | Geen uitgaansgelegenheden gevonden. Probeer een andere categorie. / No nightlife venues found. Try another category. |
-| 6 Verhuur, catering | 17968 | Geen verhuur of catering gevonden. Probeer een andere categorie. / No rental or catering found. Try another category. |
-
-*Waarom "probeer een andere categorie": de categorie-dropdown toont de hele
-taxonomie, niet alleen wat er in die plaats staat — in Amsterdam leveren 9 van de
-13 opties op de tab Activiteiten niets op. Dat is de meest voorkomende reden dat
-deze lijsten leeg zijn.*
+#### Wat er nog ligt
 
-**C · Eén losse lijst**
+**1 · `HorecagelegenhedenOverzichtProvinciePage` — 6 tabs** (staat er nog met
+6× `logo800px`). Bereikbaar via de drawer onder **Provincie**. Zelfde zes tabs in
+dezelfde volgorde als `...OverzichtCurrent`; filter de tree op `StaggeredView`,
+dan staan ze in tabvolgorde. Per plek: node → Styling → filter `Empty` → toggle →
+filter **wissen** → sectie *Empty List Widget* → Widget Type **Component** →
+`LegeLijstMelding` → twee teksten.
 
-| # | Waar | nlTekst / enTekst |
+| Tab | nlTekst | enTekst |
 |---|---|---|
-| C1 | `thuisBezorgen` | Geen bezorgdiensten gevonden in deze plaats. / No delivery services found in this town. |
-
-**D · Favorieten — ✅ AF (stond al in de export van 2026-09-23 13:45: alle drie de tabs tonen `LegeLijstMeldingWidget`; onderstaande tabel alleen nog ter referentie)**
-
-Deze drie tonen nu een volledig leeg scherm. Naast het component moet hier eerst
-*Show Empty List Widget* aangezet worden.
-
-| # | Tab | Lijst | nlTekst / enTekst |
-|---|---|---|---|
-| D1 | 1 Persoonlijke agenda | `favorietenAgendaItems` | Je persoonlijke agenda is nog leeg. / Your personal agenda is still empty. |
-| D2 | 2 Favoriete gemeenten | `favorieteGemeenteItem` | Je volgt nog geen gemeenten. / You are not following any municipalities yet. |
-| D3 | 3 Favoriete Gelegenheden | `favorieteHorecagelegenheid` | Je hebt nog geen favoriete gelegenheden. Tik op het hartje bij een zaak om hem hier te bewaren. / You have no favourite venues yet. Tap the heart on a venue to save it here. |
+| 1 Activiteiten | Geen activiteiten gevonden. Probeer een andere categorie. | No activities found. Try another category. |
+| 2 Cultuur | Geen culturele gelegenheden gevonden... | No cultural venues found... |
+| 3 Eetgelegenheden | Geen gelegenheden gevonden... | No places found... |
+| 4 Overnachten | Geen gelegenheden gevonden... | No places found... |
+| 5 Uitgaan | Geen gelegenheden gevonden... | No places found... |
+| 6 Verhuur, catering | Geen gelegenheden gevonden... | No places found... |
+
+**2 · `mijnProfiel`, tab Nieuwsbrieven** — die `ListView` (op `NieuwsbrievenCall`)
+heeft géén lege staat. Voorstel: *"Er zijn op dit moment geen nieuwsbrieven."* /
+*"There are no newsletters at the moment."*
 
-**Bewust NIET doen**
+**3 · Drie FOTOcarousels — eigen besluit, geen lijsten.** Een tekstmelding in een
+beeldcarousel is discutabel: `HorecagelegenheidCurrent` (toont nu een logo),
+`EvenementHorecagelegenheid` en `EventCurrent` (tonen niets).
 
-- `evenement_component` (`lib/evenement/evenement_component/`) — hangt alleen aan
-  de pagina `Event`, en die heeft **0 aanroepers**: wees. Overslaan.
-- `HorecagelegenheidCurrent` regel ~245 — dat is de **fotocarousel** van een zaak
-  zonder foto's, geen lege lijst. Een tekstmelding in een beeldcarousel is raar;
-  hier is verbergen of een beeld-placeholder logischer. Aparte beslissing voor Bob.
+**4 · Optioneel:** 4× het oude `LegeLijstComponent` op `mijnProfiel` (+1 in
+`FotoboekGridComponent`) omzetten naar `LegeLijstMelding`. Werkt prima, alleen
+eentalig — geen bug.
 
-#### De inventaris (onderzoek 2026-09-22)
+**Wezen, niet doen:** `evenement_component` (pagina `Event`, 0 aanroepers) en
+`SliderUitgaanComponentSmallCurrent` (0 aanroepers).
 
-Kies je een categorie zonder treffers, dan verschijnt een kaal `logo800px.png`.
-`LegeLijstComponent` (Icon `event_busy` + `Text`) doet dit al goed op `mijnProfiel`.
+⚠️ Kleine inconsistentie, geen bug: *Center Component* staat op de horeca-tabs
+**uit** en op `MijnAanmeldingen` **aan**.
 
-**Volledige inventaris — 18 plekken in LEVENDE code, 9 bestanden.** De dode
-kopieën (`kanweg/*`, `home_copy`, `home_copy2`, `p_uitgaan_page_copy{,2,3}`,
-`drawer_component_copy`, `mijn_profiel_copy*`, `evenement/event`) bevatten nog
-~15 logo's; geverifieerd wees (alleen zelfreferenties), overslaan.
+### 132-G2 · `MijnAanmeldingen` toont UITGELOGD vier kaarten met "null"
 
-| Waar | Plekken | Dekt |
-|---|---|---|
-| `HomeUitgaantabelKaartComponent` | 1 | **alle 5 Home-tabs** (één component) |
-| `HomeUitgaanSliderComponent` | 1 | Home-slider (Carousel) |
-| `PUitgaantabelKaartComponent` | 1 | PUitgaanPage-lijst |
-| `PUitgaanSliderComponent` | 1 | PUitgaan-slider (Carousel) |
-| `MijnAanmeldingen` | 1 | staat op `uitgaanskrant.com-applogo.jpg` |
-| `horecagelegenhedenOverzichtCurrent` | 6 | één per tab |
-| `HorecagelegenhedenOverzichtProvinciePage` | 6 | ⚠️ **wél bereikbaar**, `drawer_component_widget.dart:1209` |
-| `thuisBezorgen` | 1 | |
-| `HorecagelegenheidCurrent:248` | 1 | fotocarousel van een zaak — ander geval, beeld-placeholder verdedigbaar |
-
-Daarnaast: **Favorieten tab 1-3 hebben helemáál geen Empty List Widget** (zie
-132-H), en de agenda-tab van een zaak gebruikt een eigen component
-`GeenEvenementenComponentmoetweg` (Icon + vaste tekst) — functioneel al goed,
-opruimkandidaat.
-
-**Carousels:** op #2 en #4 staat de toggle al aan (er staat immers een Image),
-dus alleen *Widget Type* → Component. Reken er toch op dat dit er twee voor Bob
-zijn; `CLAUDE.md` meldt die checkbox als voor Claude onbereikbaar.
-
-#### i18n — onderzocht 2026-09-22, dit is de kern
-
-De `tekst`-parameter is een **letterlijke string**, dus geen globe en geen
-Engelse vertaling. Drie dingen uitgezocht:
-
-1. **`FFLocalizations.getVariableText({nlText, enText})` bestaat al** in
-   `internationalization.dart` — dat is wat FlutterFlow genereert voor een
-   niet-statische tekst. Nergens in gebruik.
-2. ⚠️ **De Global Property `locale` is in dit project ONBRUIKBAAR — altijd
-   `null`.** `MyApp._locale` begint op `null` en `setAppLanguage()` heeft
-   **nul aanroepers** (er is geen taalkiezer). De werkelijke taal komt uit de
-   Localizations-delegate (systeemtaal), en die is in de builder geen bron. Een
-   Visibility-conditie op "huidige taal" werkt hier dus niet. Niet proberen.
-3. Een custom **function** kan er niet bij (geen `BuildContext`); een custom
-   **widget** wel.
-
-**Drie werkbare routes:**
-
-- **D (aanbevolen) — losse componenten per melding.** `Duplicate Component` van
-  `LegeLijstComponent`, `tekst`-parameter eraf, vaste `Text` + globe. Nul
-  condities, per aanroepplek alleen "Empty List Widget → Component → kies".
-  Teksten belanden in `internationalization.dart`, dus de vertaalaudit ziet ze.
-  Kosten: ~10-12 componenten in de lijst.
-- **C — één component met een `soort`-parameter** (String) en N conditionele
-  `Text`-widgets, elk met eigen i18n-sleutel. Houdt de componentenlijst schoon,
-  maar kost 12× een Visibility-conditie met een letterlijke Second Value (het
-  bekende verstopte veld). Het patroon zelf is bewezen: `mijn_aanmeldingen_widget.dart:408`
-  heeft al `if (widget!.type == 'go_out_event')`.
-- **A — custom widget** met `getVariableText(nlText:, enText:)` en twee
-  String-parameters. Minste fragiele klikwerk, maar de teksten staan dan niet in
-  `internationalization.dart` (geen globe, geen audit).
-
-**Openstaand besluit voor Bob: D, C of A.** Reken op ~10-12 unieke teksten en
-22 aanroepplekken (18 hierboven + de 4 bestaande op `mijnProfiel` die van
-`tekst:` af moeten bij route D of C).
+Gevonden 2026-09-23 op een release-APK na `pm clear`. Het endpoint geeft anoniem
+een foutmelding-array terug, en die wordt als lijst-met-items gerenderd: vier
+witte kaarten met 3× `null` en een Kopie-knop. Hoort een lege staat of een
+inlog-uitnodiging te zijn. *(Terzijde: hierdoor werkt "uitgelogd" niet als test
+voor een lege lijst — zet in plaats daarvan het netwerk uit, zie `CLAUDE.md`.)*
 
 ### 132-H · Favorieten is uitgelogd een leeg scherm