|
|
@@ -2063,6 +2063,61 @@ Component"** (maakt een volledige, werkende kopie inclusief Backend
|
|
|
Query en pagination), en **"Copy Action Chain"/"Paste Action(s)"** voor
|
|
|
losse actieketens (zie de valkuil daarbij elders in dit bestand).
|
|
|
|
|
|
+**Een tweede blok naast een bestaand blok zetten (bv. een ingelogde én een
|
|
|
+uitgelogde variant op dezelfde tab): Wrap Widget → Column, dán "+" op die nieuwe
|
|
|
+buitenste Column.** Volledig bewezen 2026-09-17 (taak 77, Favorieten tab 4).
|
|
|
+De twee routes die je zou verwachten werken allebei níet, en allebei richten ze
|
|
|
+schade aan die je pas in de export ziet:
|
|
|
+- ⚠️ **Een `TabBar Page` heeft precies ÉÉN kind.** "+"/Insert Widget op die rij
|
|
|
+ **vervangt** wat erin zit in plaats van toe te voegen — zonder waarschuwing.
|
|
|
+ Eén klik maakte zo een hele tab leeg (1104 → 766 regels). Herstel: de
|
|
|
+ **undo-knop in de werkbalk** (linksboven); **Ctrl+Z werkte niet**.
|
|
|
+- ⚠️ **`Duplicate` op een widget waar je net een Visibility-conditie op hebt
|
|
|
+ gezet, hernummert stil alle i18n-sleutels eronder.** In de tree lijkt de
|
|
|
+ duplicatie te mislukken (geen tweede node), maar de bestaande sleutels zijn
|
|
|
+ vervangen door verse — met een **lege Engelse vertaling**, en de oude sleutels
|
|
|
+ zijn uit `internationalization.dart` verdwenen. Wil je zo'n blok toch
|
|
|
+ dupliceren: doe dat **vóór** je de conditie zet.
|
|
|
+**Werkende volgorde:** (1) rechtsklik het bestaande blok → *Wrap Widget* →
|
|
|
+**Column**; (2) **"+" op die nieuwe buitenste Column** — een Column accepteert
|
|
|
+wél meerdere kinderen; (3) conditie op elk van de twee blokken. Voor de
|
|
|
+omgekeerde conditie is geen "opposite"-truc nodig: de operatorlijst bevat
|
|
|
+gewoon **"Is Not Set or Is Empty"** naast "Is Set and Not Empty".
|
|
|
+*Let op de positie in de Insert-dropdown:* rij 1 is Text / Column / Row, rij 2
|
|
|
+is Container / Image / Button — de derde kolom is dus Row resp. Button, niet
|
|
|
+Column.
|
|
|
+
|
|
|
+**⚠️ Een onderbroken conditie-dialoog blokkeert de export van het HELE project,
|
|
|
+niet alleen die pagina.** Bevestigd 2026-09-17: Chrome viel weg terwijl de
|
|
|
+Set-Variable-dialoog openstond, en liet een Conditional achter die aanstond met
|
|
|
+een lege First Value. `flutterflow export-code` faalde daarna met
|
|
|
+`Error generating code for the project` — twee keer, dus geen serverhikje. Alle
|
|
|
+sessies zaten vast tot de conditie was afgemaakt (of de toggle uit). Herkenbaar
|
|
|
+aan een rood **`UNSET == Second Value`**-veld in de Visibility-sectie. Raak je
|
|
|
+onderweg de browser kwijt met zo'n dialoog open: **meld het meteen**, want
|
|
|
+anderen lopen er ook op vast.
|
|
|
+
|
|
|
+**Bob's werkwijze bij een riskante structuurwijziging: maak eerst een kopie van
|
|
|
+de pagina en oefen daarin.** Voorgesteld door Bob op 2026-09-17 nadat twee
|
|
|
+bouwroutes op de echte pagina schade hadden aangericht; het trok de taak in één
|
|
|
+keer vlot. *Duplicate Page* op de pagina in de lijst → oefen de volledige route
|
|
|
+in de kopie → verifieer met een export dat de structuur klopt → pas 'm dan pas
|
|
|
+toe op het origineel. Kost één export extra en een dode pagina (die op de
|
|
|
+P2-7-opruimlijst gaat), en het scheelt undo-rondes op productiecode.
|
|
|
+
|
|
|
+**Een `GridView` met `childAspectRatio` kan op een telefoon stil onleesbaar
|
|
|
+worden — en niets meldt dat.** Gevonden 2026-09-16 op de horeca-agenda:
|
|
|
+`crossAxisCount: 2` + `childAspectRatio: 3.0` geeft op 411 dp een cel van
|
|
|
+**63 dp** terwijl de inhoud er ~180 nodig heeft, dus de kaarten tekenden over
|
|
|
+elkaar heen. Géén gele overflow-streep, niets in `dart analyze`, niets in
|
|
|
+`logcat` — een GridView-cel klipt niet, dus Flutter ziet geen fout. Op een
|
|
|
+tablet valt het mee (623 dp breed → 208 dp hoog), waardoor het jaren onopgemerkt
|
|
|
+bleef. **Vaste fix: `Replace Widget` → StaggeredView met Cross Axis Count als
|
|
|
+Responsive Value 1/1/2/3** — die kent `childAspectRatio` niet eens en geeft elk
|
|
|
+kind zijn eigen hoogte. Zat er geen pagination op, dan is de Replace zonder
|
|
|
+voorbereiding te doen en gaat `shrinkWrap` er vanzelf af (wat klopt zodra de
|
|
|
+ouder een begrensde hoogte geeft, bv. een `Expanded`).
|
|
|
+
|
|
|
**Een widget VERPLAATSEN lukt wél — sleep de rij in de Widget Tree, en
|
|
|
een drop op een container-rij voegt hem er altijd als EERSTE kind in.**
|
|
|
Bevestigd 2026-09-03 (P1-36, `HorecagelegenheidoverzichtKaart`): een
|
|
|
@@ -2960,6 +3015,21 @@ modal.
|
|
|
wrappen) blijft de Insert-modal het enige pad — dan na 1-2 pogingen
|
|
|
stoppen en aan Bob overdragen, zoals altijd.
|
|
|
|
|
|
+**Een vertaal-audit op `internationalization.dart` vindt drie dingen — maar
|
|
|
+géén slecht Engels.** Script-matig te vinden zijn: *lege* `en`, `en == nl`, en
|
|
|
+een `en` die over meerdere verschillende `nl` is hergebruikt (het
|
|
|
+`Duplicate`-patroon: een kopie erft de tekst van het origineel, dus "Terug" komt
|
|
|
+als *Favorite* in het Engels terecht). **Wat een script niet ziet is een
|
|
|
+vertaling die er keurig uitziet maar fout is** — "Eetgelegenheden" → *Eatings*,
|
|
|
+"Overnachten" → *Overnight* telden allebei als "vertaald". Een menselijke blik
|
|
|
+over de labels blijft dus nodig; de audit vervangt dat niet.
|
|
|
+⚠️ **Tel alleen sleutels die in bereikbare schermen gebruikt worden.** Bepaal
|
|
|
+dat door vanaf de startpagina de widget-graaf te volgen (`nav.dart` → entry-
|
|
|
+pagina's → `XWidget.routeName` / `XWidget(`); elke FlutterFlow-pagina staat in
|
|
|
+`nav.dart`, dus "staat in nav.dart" zegt niets over bereikbaarheid. Stand
|
|
|
+2026-09-16: **31 van de 50 widgets bereikbaar, 19 wezen** — de oude telling van
|
|
|
+134 lege vertalingen zat vol dode kopieën.
|
|
|
+
|
|
|
**Vertalingen invullen: het Settings → Languages-paneel SCROLLT NIET voor
|
|
|
Claude — gebruik het globe-icoontje op het widget zelf.** Bevestigd
|
|
|
2026-09-08 (P1-17, 22 vertalingen doorgezet). Het Languages-paneel
|