Просмотр исходного кода

128-B voortgang: tab + lijst staan, Switch bleek onbruikbaar in een dynamische lijst

API Call, vierde tab, Backend Query en Generate Dynamic Children zijn
klaar en export-geverifieerd (null-veilig). De Switch per rij moest
eruit: FlutterFlow houdt widget state per pagina, niet per lijst-item,
dus alle rijen deelden een enkele bool en toonden dezelfde stand. Dat is
in de builder onzichtbaar. Vervangen door conditionele icoonknoppen, het
patroon van het favorietenhartje.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
bob 10 часов назад
Родитель
Сommit
9e76fc0b40
1 измененных файлов с 59 добавлено и 5 удалено
  1. 59 5
      TASKS.md

+ 59 - 5
TASKS.md

@@ -47,7 +47,7 @@ Google Play en één doorloop die alleen Bob kan doen.
 | **Bij livegang** | Schakelaars en opruimklussen | Eigen blok hieronder |
 | **Bij livegang** | Schakelaars en opruimklussen | Eigen blok hieronder |
 | ~~115~~ | ~~AdBanner verplaatsen~~ | ✅ **AF** (Bob 2026-09-20, export-geverifieerd): volgorde is nu slider → banner → filterbalk → lijst |
 | ~~115~~ | ~~AdBanner verplaatsen~~ | ✅ **AF** (Bob 2026-09-20, export-geverifieerd): volgorde is nu slider → banner → filterbalk → lijst |
 | ~~116~~ | ~~AdBanner springt~~ | ✅ **AF** (Bob 2026-09-20): Container `65/65/105/105` mét de padding erin, dus de banner krijgt zijn volle 50 resp. 90 dp én de lucht tot de slider blijft |
 | ~~116~~ | ~~AdBanner springt~~ | ✅ **AF** (Bob 2026-09-20): Container `65/65/105/105` mét de padding erin, dus de banner krijgt zijn volle 50 resp. 90 dp én de lucht tot de slider blijft |
-| **121** | 15 verweesde mappen in `lib/` opruimen | Staan lokaal én in git, maar FlutterFlow levert ze niet meer. Twee ervan breken `dart analyze`. Eigen blok hieronder |
+| **121** | 15 verweesde mappen in `lib/` opruimen (+ `get_streamed_response_web.dart`/`_http.dart`, zie 2026-09-21) | Staan lokaal én in git, maar FlutterFlow levert ze niet meer. Twee ervan breken `dart analyze`. Eigen blok hieronder |
 | **120** | 12 hardcoded kleuren aan thematokens binden | ⚠️ Claude kwam er 2026-09-20 niet in: widget-selectie in de tree landt niet in Bob's huidige Chrome-venster. Inventaris mét vindplaatsen staat klaar | Alle 12 zijn exact gelijk aan een bestaand token, dus nu onzichtbaar — maar ze lopen niet mee bij een themawijziging. Eigen blok hieronder |
 | **120** | 12 hardcoded kleuren aan thematokens binden | ⚠️ Claude kwam er 2026-09-20 niet in: widget-selectie in de tree landt niet in Bob's huidige Chrome-venster. Inventaris mét vindplaatsen staat klaar | Alle 12 zijn exact gelijk aan een bestaand token, dus nu onzichtbaar — maar ze lopen niet mee bij een themawijziging. Eigen blok hieronder |
 | ~~117~~ | ~~Kalenderpermissie eruit~~ | ✅ **AF** (Bob 2026-09-20, export-geverifieerd): `READ_CALENDAR`/`WRITE_CALENDAR` én `NSCalendarsUsageDescription` zijn weg; `CAMERA` staat er nog (terecht) |
 | ~~117~~ | ~~Kalenderpermissie eruit~~ | ✅ **AF** (Bob 2026-09-20, export-geverifieerd): `READ_CALENDAR`/`WRITE_CALENDAR` én `NSCalendarsUsageDescription` zijn weg; `CAMERA` staat er nog (terecht) |
 | **118** | AdMob EU-consentbericht | ⚠️ Half: de FlutterFlow-toggle staat goed, maar het bericht moet in de **AdMob-console** gepubliceerd zijn. Eigen blok hieronder |
 | **118** | AdMob EU-consentbericht | ⚠️ Half: de FlutterFlow-toggle staat goed, maar het bericht moet in de **AdMob-console** gepubliceerd zijn. Eigen blok hieronder |
@@ -344,6 +344,50 @@ zijn hernummerd). Te herstellen via het globe-icoontje, meenemen in 128-F:
 De twee "Kopie"-sleutels horen bij taak 127 van de andere sessie; die zijn
 De twee "Kopie"-sleutels horen bij taak 127 van de andere sessie; die zijn
 meegehernummerd omdat ze op dezelfde pagina staan.
 meegehernummerd omdat ze op dezelfde pagina staan.
 
 
+### 128-B · voortgang 2026-09-21 (Claude, in de builder)
+
+**Klaar en export-geverifieerd:**
+- API Call **`Nieuwsbrieven`** — top-level GET, `Cookie: '${sessionName}=${sessid}'`
+  met echte interpolatie, en `static List? items(...)` met `true` + `as List?`.
+- Vierde tab **"Nieuwsbrieven"** op `mijnProfiel` (achter Account).
+- In die tab: `Column > ListView` met **Backend Query** op die call
+  (`sessionName`/`sessid` aan App State gebonden) en **Generate Dynamic Children**
+  via **Predefined Path `items`** → de export toont
+  `NieuwsbrievenCall.items(...)?.toList() ?? []`, dus null-veilig.
+- Item-template `Row > Column > [Text $.naam, Text $.omschrijving]`.
+
+### ⚠️ Nieuw gegeven: een `Switch` werkt NIET in een dynamische lijst
+
+Ik had per rij een `Switch` gezet met Initial Value op `$.geabonneerd`. De export
+laat zien waarom dat niet kan:
+
+```dart
+Switch.adaptive(
+  value: _model.switchValue ??= getJsonField(nieuwsbriefItemItem, r'$.geabonneerd'),
+```
+
+en in het model staat **één** `bool? _switchValue;` voor de hele pagina. Widget
+state is in FlutterFlow per *pagina*, niet per lijst-item, dus de `??=` wordt door
+de eerste rij gevuld en **alle rijen tonen daarna dezelfde stand**. Dat is een
+stille bug: in de builder ziet het er correct uit.
+
+Geldt voor elk widget met eigen waarde-state (Switch, Checkbox, TextField) binnen
+*Generate Dynamic Children*. Twee uitwegen:
+1. **Conditionele widgets** — twee varianten met tegengestelde Visibility-condities
+   op het loop-item. Geen widget state, dus per rij correct. Dit is het patroon van
+   het favorietenhartje en van taak 77.
+2. **De rij een eigen component maken** — elke instantie krijgt dan een eigen model,
+   dus een echte Switch werkt wel. Netter, maar de bindingen naar het loop-item
+   moeten dan als component-parameters opnieuw gelegd worden.
+
+Gekozen: **route 1**. De Switch is verwijderd en er staat nu een `IconButton` in
+de Row; die krijgt een conditie + actie, en wordt daarna gedupliceerd voor de
+omgekeerde stand.
+
+**Nog te doen in deze tab:** icoon + conditie + `drupalRequest`-actie op beide
+knoppen (subscribe/unsubscribe, **met `FFAppState().userToken` als 5e argument**,
+anders `CSRF validation failed` en stil `[]`), Column op Expanded.
+
 ### 128-C · Waarschuwing bij 0 gevolgde gemeenten · Eigenaar: Claude
 ### 128-C · Waarschuwing bij 0 gevolgde gemeenten · Eigenaar: Claude
 
 
 Bob's keuze 2026-09-21. **Gemeten: 17 van de 18 actieve abonnees op de
 Bob's keuze 2026-09-21. **Gemeten: 17 van de 18 actieve abonnees op de
@@ -1218,6 +1262,7 @@ ruimt de lokale map niet op (bekend patroon, staat in `CLAUDE.md`).
 ```
 ```
 lib/favorieten_copy                                          lib/kanweg_test_upload
 lib/favorieten_copy                                          lib/kanweg_test_upload
 lib/favorieten_copy2                                         lib/shared/drawer_component_copy
 lib/favorieten_copy2                                         lib/shared/drawer_component_copy
+lib/backend/api_requests/get_streamed_response_web.dart  (+ _http.dart)
 lib/horecagelegenhedenoverzicht/horecagelegenheid_event_tabel_component_copy
 lib/horecagelegenhedenoverzicht/horecagelegenheid_event_tabel_component_copy
 lib/kanweg  (+ kanweg_header_buttons_component_copy,         lib/shared/geen_evenementen_component
 lib/kanweg  (+ kanweg_header_buttons_component_copy,         lib/shared/geen_evenementen_component
      kanweg_home_copy, kanweg_horecagelegenheden_overzicht,  lib/shared/header_current_copy
      kanweg_home_copy, kanweg_horecagelegenheden_overzicht,  lib/shared/header_current_copy
@@ -1229,8 +1274,17 @@ lib/kanweg  (+ kanweg_header_buttons_component_copy,         lib/shared/geen_eve
 **Waarom het meer is dan rommel:** twee ervan geven een **harde compile-error**.
 **Waarom het meer is dan rommel:** twee ervan geven een **harde compile-error**.
 `kanweg/kanweghorecagelegenheid_current_copy` en `shared/drawer_component_copy`
 `kanweg/kanweghorecagelegenheid_current_copy` en `shared/drawer_component_copy`
 roepen `KanwegHorecagelegenhedenOverzichtWidget` aan, en `lib/index.dart`
 roepen `KanwegHorecagelegenhedenOverzichtWidget` aan, en `lib/index.dart`
-exporteert die map niet (meer). `dart analyze` op de projectmap geeft daardoor
-**2 errors**, terwijl een verse export er **0** geeft.
+exporteert die map niet (meer).
+
+**Er is er 2026-09-21 een derde bijgekomen, met een nieuwe oorzaak.** De export
+levert sindsdien alleen nog `get_streamed_response.dart` (die kaal `http` gebruikt);
+de oude `_web.dart`/`_http.dart` uit de conditional-import-opzet komen niet meer mee.
+Tegelijk haalde FlutterFlow **`fetch_api` en `fetch_client` uit `pubspec.yaml`** —
+terecht, want niemand gebruikt ze nog. Gevolg: `get_streamed_response_web.dart` staat
+er nog, importeert een package dat er niet meer is, en levert **5 analysefouten**.
+Niets importeert dat bestand (`grep` bevestigd), dus de **build** breekt er niet op —
+alleen `dart analyze`. Samen met de twee hierboven: `dart analyze` op de projectmap
+geeft **7 errors**, terwijl een verse export er **0** geeft.
 
 
 ⚠️ **Die twee errors stonden al op master vóór de commit van 2026-09-20** — het is
 ⚠️ **Die twee errors stonden al op master vóór de commit van 2026-09-20** — het is
 dus geen regressie van die commit, maar ze blokkeren wel een lokale build vanuit de
 dus geen regressie van die commit, maar ze blokkeren wel een lokale build vanuit de
@@ -1240,8 +1294,8 @@ bouwt (dat vertrekt vanuit de cloud-staat, niet vanuit deze map).
 **Doen, als je de projectmap weer wilt kunnen builden:**
 **Doen, als je de projectmap weer wilt kunnen builden:**
 ```bash
 ```bash
 cd /home/bob/Projects/ff-app/uitgaanskrant-1qhvtd
 cd /home/bob/Projects/ff-app/uitgaanskrant-1qhvtd
-git rm -r --cached -q lib/favorieten_copy lib/favorieten_copy2 lib/kanweg lib/kanweg_test_upload lib/shared/drawer_component_copy lib/shared/geen_evenementen_component lib/shared/header_current_copy lib/uitgaanspaginas/home_copy2 lib/uitgaanspaginas/home_uitgaan_slider_component_copy lib/uitgaanspaginas/home_uitgaantabel_kaart_component_copy lib/horecagelegenhedenoverzicht/horecagelegenheid_event_tabel_component_copy
-rm -rf lib/favorieten_copy lib/favorieten_copy2 lib/kanweg lib/kanweg_test_upload lib/shared/drawer_component_copy lib/shared/geen_evenementen_component lib/shared/header_current_copy lib/uitgaanspaginas/home_copy2 lib/uitgaanspaginas/home_uitgaan_slider_component_copy lib/uitgaanspaginas/home_uitgaantabel_kaart_component_copy lib/horecagelegenhedenoverzicht/horecagelegenheid_event_tabel_component_copy
+git rm -r --cached -q lib/favorieten_copy lib/favorieten_copy2 lib/kanweg lib/kanweg_test_upload lib/shared/drawer_component_copy lib/shared/geen_evenementen_component lib/shared/header_current_copy lib/uitgaanspaginas/home_copy2 lib/uitgaanspaginas/home_uitgaan_slider_component_copy lib/uitgaanspaginas/home_uitgaantabel_kaart_component_copy lib/horecagelegenhedenoverzicht/horecagelegenheid_event_tabel_component_copy lib/backend/api_requests/get_streamed_response_web.dart lib/backend/api_requests/get_streamed_response_http.dart
+rm -rf lib/favorieten_copy lib/favorieten_copy2 lib/kanweg lib/kanweg_test_upload lib/shared/drawer_component_copy lib/shared/geen_evenementen_component lib/shared/header_current_copy lib/uitgaanspaginas/home_copy2 lib/uitgaanspaginas/home_uitgaan_slider_component_copy lib/uitgaanspaginas/home_uitgaantabel_kaart_component_copy lib/horecagelegenhedenoverzicht/horecagelegenheid_event_tabel_component_copy lib/backend/api_requests/get_streamed_response_web.dart lib/backend/api_requests/get_streamed_response_http.dart
 fvm dart analyze lib/ | grep -c "^  error -"   # hoort 0 te zijn
 fvm dart analyze lib/ | grep -c "^  error -"   # hoort 0 te zijn
 ```
 ```
 ⚠️ Controleer vóór het uitvoeren dat `favorieten_copy2` en `header_current_copy`
 ⚠️ Controleer vóór het uitvoeren dat `favorieten_copy2` en `header_current_copy`