|
|
@@ -1,11 +1,16 @@
|
|
|
## ▶ Nu aan de beurt (stand 2026-09-13)
|
|
|
|
|
|
-### 🔧 Verbindingsmelding in de header — code klaar, bouwstappen voor Bob
|
|
|
+### 🔧 Verbindingsmelding in de header — Eigenaar: Bob — bezig (2026-09-13)
|
|
|
|
|
|
Bob's keuze 2026-09-13: niet elke pagina aanpassen, maar **één melding in de
|
|
|
header**, gevoed door een App State-vlag die de app zelf zet. Claude heeft de
|
|
|
custom code geschreven en live getest op emulator-5556 (eigen profile-build,
|
|
|
-banner tijdelijk in `home_widget.dart` geprikt).
|
|
|
+banner tijdelijk in `home_widget.dart` geprikt); **Bob voert de builder-stappen
|
|
|
+zelf uit.**
|
|
|
+
|
|
|
+📄 **De code staat in de repo: `snippets/check_verbinding.dart.txt` en
|
|
|
+`snippets/verbindings_banner.dart.txt`** (buiten `lib/`, dus een export raakt ze
|
|
|
+niet aan). Zie `snippets/LEESMIJ.md`.
|
|
|
|
|
|
⚠️ **Waarom dit een Custom WIDGET is en geen Text met een Visibility-conditie.**
|
|
|
De widgets in dit project lezen App State via de singleton `FFAppState()`, niet
|
|
|
@@ -18,9 +23,8 @@ action de vlag met `FFAppState().update(...)` en niet met een kale toewijzing:
|
|
|
**alleen `update()` roept `notifyListeners()` aan** (de setters in
|
|
|
`app_state.dart` doen dat niet).
|
|
|
|
|
|
-**De twee bestanden** staan in de chat van 2026-09-13 als download. Plak steeds
|
|
|
-alleen wat ónder de `// DO NOT REMOVE`-regel staat; de importkop genereert
|
|
|
-FlutterFlow zelf.
|
|
|
+Plak steeds alleen wat ónder de `// DO NOT REMOVE`-regel staat; de importkop
|
|
|
+genereert FlutterFlow zelf.
|
|
|
- **Custom Action `checkVerbinding`** — één HEAD-request op de site-root.
|
|
|
Gemeten: HTTP 200, **0 bytes, 57 ms** (tegenover 34 KB / 1,3 s voor een gewone
|
|
|
data-call), dus verwaarloosbaar. Een 401/404 telt als bereikbaar; alleen 5xx,
|
|
|
@@ -122,19 +126,16 @@ gelezen.
|
|
|
|
|
|
<details><summary>Oorspronkelijke bevinding (2026-09-13, vóór de fix)</summary>
|
|
|
|
|
|
-**A · Tab 6 "Verhuur, catering" is niet meegemigreerd — en kapt content af.
|
|
|
-17 van de 42 Amsterdamse zaken zijn onbereikbaar.**
|
|
|
+**A · Tab 6 "Verhuur, catering" is niet meegemigreerd naar de gefilterde
|
|
|
+route.** (Het afkappen op 25 is opgelost; drie punten staan nog open.)
|
|
|
Op `horecagelegenhedenOverzichtCurrent` bouwen vijf tabs hun lijst via
|
|
|
`functions.filterHorecagelegenheden(_model.alleX.toList(), ...)`. De zesde
|
|
|
(Verhuur, catering) doet het nog op de oude manier: een eigen Backend Query
|
|
|
plus `getJsonField(jsonBody, r'$').toList().take(25)`. Gevolgen, op volgorde
|
|
|
van ernst:
|
|
|
-1. ✅ **OPGELOST 2026-09-13 (Bob): `.take(25)` staat nu op `.take(1000)`** —
|
|
|
- exportgeverifieerd. De 42 Amsterdamse verhuur/catering-zaken komen nu
|
|
|
- allemaal door. **Belangrijke bijvangst: het Generate Dynamic Children-paneel
|
|
|
- schrijft in Bob's browser dus wél weg op deze pagina** — de blokkade die in
|
|
|
- `CLAUDE.md` staat is Claude-specifiek, niet iets in de opgeslagen
|
|
|
- paginadata.
|
|
|
+1. ✅ *(De limiet van 25 is 2026-09-13 door Bob opgelost: `.take(1000)`,
|
|
|
+ exportgeverifieerd. Daarmee bleek ook dat het Generate Dynamic
|
|
|
+ Children-paneel voor Bob gewoon wegschrijft — dat staat nu in `CLAUDE.md`.)*
|
|
|
2. **Geen zoekveld** op deze tab — dit is het bekende "5 van de 6"-restpunt
|
|
|
uit P2-6, nu exact gelokaliseerd.
|
|
|
3. ⚠️ **Crasht bij een netwerkfout — nu HARD BEWEZEN, en het raakt meer dan
|
|
|
@@ -161,69 +162,6 @@ gevolg: er is content die een gebruiker niet kan zien.**
|
|
|
|
|
|
</details>
|
|
|
|
|
|
-**B · ✅ AFGEHANDELD — geen hartje op het horecakaartje, Bob's besluit
|
|
|
-2026-09-13: "geeft te veel load".** Het favorietenhartje op de
|
|
|
-horeca-OVERZICHTSkaart is inderdaad verdwenen (gesneuveld in commit `7094b43`,
|
|
|
-taak 18, toen Copy3 productie werd), maar dat blijft zo — **niet terugbouwen**.
|
|
|
-Favoriet maken loopt voortaan uitsluitend via de detailpagina; op Favorieten
|
|
|
-tab 3 staan dus bewust geen hartjes en ontvolgen gaat via doorklikken naar de
|
|
|
-zaak. P1-7's tekst is hierop gecorrigeerd.
|
|
|
-*(Restje, cosmetisch en zonder haast: de parameter `nid` wordt nog steeds aan
|
|
|
-`HorecagelegenheidoverzichtKaart` doorgegeven maar nergens meer gelezen — het
|
|
|
-overblijfsel van het verwijderde hartje. De pagina gebruikt zijn eigen `nid`
|
|
|
-voor de tap-navigatie, dus er is niets stuk.)*
|
|
|
-
|
|
|
-**C · Hetzelfde crashpatroon staat ook op HOME — de startpagina van de app.**
|
|
|
-Nadat bevinding A's punt 3 hard bewezen was, projectbreed gezocht naar
|
|
|
-`getJsonField(x, pad).toList()` zónder de `isList`-vlag. In **levende** code
|
|
|
-(dus zonder `kanweg/`, `_copy*` en `_orgineel*`) staan 11 plekken. Na filteren
|
|
|
-op wat een gebruiker echt kan bereiken blijven er vier over:
|
|
|
-
|
|
|
-| plek | pad | bereikbaar via |
|
|
|
-|---|---|---|
|
|
|
-| `home_uitgaan_slider_component_widget.dart:161` | `$` | **Home — de startpagina** |
|
|
|
-| `p_uitgaan_slider_component_widget.dart:158` | `$` | P-Uitgaan-pagina |
|
|
|
-| `horecagelegenheden_overzicht_current_widget.dart:1643` | `$` | horeca-overzicht, tab 6 |
|
|
|
-| `home_uitgaantabel_kaart_component_widget.dart:651` | `$.categorie` | Home-tabs (per kaart) |
|
|
|
-
|
|
|
-De zes treffers in `horecagelegenheden_overzicht_provincie_page` tellen
|
|
|
-nauwelijks mee: die pagina staat wel in `nav.dart` maar **geen enkele knop
|
|
|
-navigeert ernaartoe** (alleen via deep-link te bereiken). En
|
|
|
-`SliderUitgaanComponentSmallCurrent` heeft nul gebruikers.
|
|
|
-
|
|
|
-**Wat er gebeurt:** `ApiManager` vangt elke exception af en levert dan
|
|
|
-`ApiCallResponse(null, {}, -1, ...)` — de Future slaagt dus, de `FutureBuilder`
|
|
|
-bouwt door, en `getJsonField(null, r'$')` geeft `null` waarop `.toList()`
|
|
|
-crasht. In een **profile**-build is dat volledig stil: geen rood scherm, geen
|
|
|
-overflow-streep, niets in `dart analyze` — alleen een grijs/leeg vlak, en
|
|
|
-volgens het bekende patroon verdwijnt alles eronder in dezelfde `Column` mee.
|
|
|
-
|
|
|
-✅ **Live nagemeten op de telefoon-emulator (2026-09-13, eigen profile-build,
|
|
|
-`svc wifi disable` + `svc data disable`) — het gebeurt echt, en Home ziet er
|
|
|
-kapot uit.** In `logcat` staat exact één regel:
|
|
|
-`NoSuchMethodError: The method 'toList' was called on null.` Op het scherm:
|
|
|
-- waar de slider hoort staat een **groot grijs blok** (beeldvullend, ± een
|
|
|
- derde van het scherm);
|
|
|
-- **de hele tabinhoud eronder is leeg** — wit, geen kaarten;
|
|
|
-- **geen enkele melding**: geen "geen verbinding", geen retry-knop, geen icoon.
|
|
|
-De app crasht dus niet wég (het proces blijft draaien, de tabbalk werkt), maar
|
|
|
-Home is niet van een stukgelopen scherm te onderscheiden. Screenshots van
|
|
|
-online vs. offline zijn 2026-09-13 in de chat gedeeld.
|
|
|
-
|
|
|
-**Oordeel: dit hoort vóór livegang gefixt.** Niet omdat er zonder netwerk data
|
|
|
-zou moeten zijn, maar omdat de eerste indruk bij een haperende verbinding een
|
|
|
-grijs vlak zonder uitleg is — en dat is precies het scenario "gebruiker opent de
|
|
|
-app in de trein". Slechts één exceptie per start, dus het is één plek per
|
|
|
-scherm, geen sleepnet.
|
|
|
-
|
|
|
-**De fix, als die nodig blijkt,** is dezelfde route die de vijf horeca-tabs al
|
|
|
-namen: niet rechtstreeks uit de Backend Query lezen, maar via een custom action
|
|
|
-die `[]` teruggeeft bij een mislukte call (`fetchAlleHorecagelegenheden` is het
|
|
|
-werkende voorbeeld, zie `!response.succeeded → break`). Een goedkopere variant
|
|
|
-voor alleen de sliders: de `Generate Dynamic Children`-binding een
|
|
|
-**"Is List"**-transform geven, want `getJsonField(..., true)` levert altijd een
|
|
|
-lijst.
|
|
|
-
|
|
|
**Wat de audit NIET vond (nagemeten, zodat niemand het nog eens doet):**
|
|
|
- **Het P1-15-patroon is projectbreed schoon.** Alle 16 `launchURL`-aanroepen
|
|
|
in levende code hangen achter een guard op de **rauwe** waarde, niet op een
|