Przeglądaj źródła

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 6 godzin temu
rodzic
commit
9e76fc0b40
1 zmienionych plików z 59 dodań i 5 usunięć
  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 |
 | ~~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 |
-| **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 |
 | ~~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 |
@@ -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
 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
 
 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_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/kanweg  (+ kanweg_header_buttons_component_copy,         lib/shared/geen_evenementen_component
      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**.
 `kanweg/kanweghorecagelegenheid_current_copy` en `shared/drawer_component_copy`
 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
 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:**
 ```bash
 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
 ```
 ⚠️ Controleer vóór het uitvoeren dat `favorieten_copy2` en `header_current_copy`