[Bug] Vier slidetypes vallen om bij een ontaarde layoutbreedte #782

Closed
opened 2026-07-23 22:43:05 +00:00 by brenno · 3 comments
Owner

Gevonden bij het aflopen van de clamp-foutklasse uit #714. Een preview die op nulbreedte wordt gemeten hoort niets te tekenen, niet te ontploffen — Flutter meet een widget vaker dan hij hem tekent, en een inklappend paneel, een rij zonder resterende ruimte of een animatie die bij nul begint levert precies die constraint.

Wat er is nagekeken

Alle 24 slidetypes gerenderd in een SizedBox(width: 0, height: 200). Zes vielen om, in vier verschillende soorten:

Type Melding
bullets, twoBullets Invalid argument(s): 1.0 — clamp met een layout-constraint als bovengrens
checklist, scopeMatrix LinearProgressIndicator: minHeight == null || minHeight > 0
timeline Unsupported operation: Infinity or NaN toInt
cockpit Meerdere uitzonderingen tegelijk (nog niet uitgesplitst)

Wat al gerepareerd is

De eerste rij, plus een NaN uit bulletScaleCap (0 / 0 wanneer de corpsgrootte nul is, die als fontSize >= 0 is not true afgaat). Zie de tak fix/preview-nulbreedte-clamp, mét regressietoets die 'past niet' van 'valt om' scheidt: een overloop van een paar pixels is bij deze breedtes de juiste uitkomst en blijft toegestaan.

Wat er nog ligt

De onderste drie rijen. Ze hebben elk een andere oorzaak en zijn niet meegenomen in die reparatie — dat zou een bugfix met drie ongerelateerde wijzigingen zijn.

Belangrijk voor de weging

Een gebruikerspad hiernaartoe is niet aangetoond. Het venster heeft op desktop een ondergrens van 1000×650 (minimumWindowSize) en de panelen hebben hun eigen vloer (_minSlideRailWidth = 210). Dit is dus hardening met een reproductie, geen gerapporteerde storing — de reden om het toch te doen is dat de volgende animatie of nieuwe layout die aanname stilzwijgend breekt, en de melding dan nergens naar de oorzaak wijst. Precies wat #714 was: Invalid argument(s): 1 zei niet wat er aan de hand was.

Prioriteit dus laag, maar de reproductie is er en kost één toets.

Gevonden bij het aflopen van de clamp-foutklasse uit #714. Een preview die op nulbreedte wordt **gemeten** hoort niets te tekenen, niet te ontploffen — Flutter meet een widget vaker dan hij hem tekent, en een inklappend paneel, een rij zonder resterende ruimte of een animatie die bij nul begint levert precies die constraint. ## Wat er is nagekeken Alle 24 slidetypes gerenderd in een `SizedBox(width: 0, height: 200)`. Zes vielen om, in vier verschillende soorten: | Type | Melding | | --- | --- | | `bullets`, `twoBullets` | `Invalid argument(s): 1.0` — clamp met een layout-constraint als bovengrens | | `checklist`, `scopeMatrix` | `LinearProgressIndicator`: `minHeight == null \|\| minHeight > 0` | | `timeline` | `Unsupported operation: Infinity or NaN toInt` | | `cockpit` | Meerdere uitzonderingen tegelijk (nog niet uitgesplitst) | ## Wat al gerepareerd is De eerste rij, plus een NaN uit `bulletScaleCap` (`0 / 0` wanneer de corpsgrootte nul is, die als `fontSize >= 0 is not true` afgaat). Zie de tak `fix/preview-nulbreedte-clamp`, mét regressietoets die 'past niet' van 'valt om' scheidt: een overloop van een paar pixels is bij deze breedtes de juiste uitkomst en blijft toegestaan. ## Wat er nog ligt De onderste drie rijen. Ze hebben elk een andere oorzaak en zijn niet meegenomen in die reparatie — dat zou een bugfix met drie ongerelateerde wijzigingen zijn. ## Belangrijk voor de weging **Een gebruikerspad hiernaartoe is niet aangetoond.** Het venster heeft op desktop een ondergrens van 1000×650 (`minimumWindowSize`) en de panelen hebben hun eigen vloer (`_minSlideRailWidth = 210`). Dit is dus hardening met een reproductie, geen gerapporteerde storing — de reden om het toch te doen is dat de volgende animatie of nieuwe layout die aanname stilzwijgend breekt, en de melding dan nergens naar de oorzaak wijst. Precies wat #714 was: `Invalid argument(s): 1` zei niet wat er aan de hand was. Prioriteit dus laag, maar de reproductie is er en kost één toets.
Author
Owner

De eerste rij is gemerged: 90a37cd3 (PR #784), op main geverifieerd. Dat dekt bullets en twoBullets (de clamp met een layout-constraint als bovengrens) plus de NaN uit bulletScaleCap.

Wat hier nog ligt zijn de andere drie rijen — checklist/scopeMatrix, timeline en cockpit. Reproductie: render elk type in een SizedBox(width: 0, height: 200) en lees tester.takeException(); test/preview_degenerate_width_test.dart staat op main en is er zo op uit te breiden.

Eén ding om over te nemen bij die uitbreiding: die toets scheidt bewust 'past niet' van 'valt om'. Een overloop van een paar pixels is bij deze breedtes de juiste uitkomst en blijft toegestaan; een ArgumentError of een gefaalde assertie niet. Zonder dat onderscheid eist de toets iets wat de layout niet kan leveren.

De eerste rij is gemerged: 90a37cd3 (PR #784), op main geverifieerd. Dat dekt `bullets` en `twoBullets` (de clamp met een layout-constraint als bovengrens) plus de NaN uit `bulletScaleCap`. Wat hier nog ligt zijn de andere drie rijen — `checklist`/`scopeMatrix`, `timeline` en `cockpit`. Reproductie: render elk type in een `SizedBox(width: 0, height: 200)` en lees `tester.takeException()`; `test/preview_degenerate_width_test.dart` staat op main en is er zo op uit te breiden. Eén ding om over te nemen bij die uitbreiding: die toets scheidt bewust 'past niet' van 'valt om'. Een overloop van een paar pixels is bij deze breedtes de juiste uitkomst en blijft toegestaan; een ArgumentError of een gefaalde assertie niet. Zonder dat onderscheid eist de toets iets wat de layout niet kan leveren.
Author
Owner

Opgepakt op tak fix/preview-nulbreedte-rest: de drie resterende oorzaken (checklist/scopeMatrix, timeline, cockpit), elk als eigen commit, en test/preview_degenerate_width_test.dart uitgebreid met het onderscheid tussen 'past niet' en 'valt om'.

Opgepakt op tak `fix/preview-nulbreedte-rest`: de drie resterende oorzaken (`checklist`/`scopeMatrix`, `timeline`, `cockpit`), elk als eigen commit, en `test/preview_degenerate_width_test.dart` uitgebreid met het onderscheid tussen 'past niet' en 'valt om'.
Author
Owner

Gemerged: 5856984b (PR #795), op main geverifieerd. Daarmee zijn alle vier de rijen uit de tabel weg.

Wat er is gerepareerd

  • checklist/scopeMatrixLinearProgressIndicator eist minHeight > 0; die dikte was van de breedte afgeleid en krijgt nu een haarlijn als ondergrens.
  • timeline — de verdiepingstelling deelde door een van de breedte afgeleide maat (Infinity/NaN, en het afronden gooit); op zo'n breedte is één verdieping het antwoord.
  • cockpit — hoekstraal min randdikte werd negatief, wat RRect weigert; nu een scherpe hoek.

Twee dingen die hier niet in stonden

De tijdlijn had een tweede oorzaak, die pas zichtbaar werd toen de eerste weg was: de clamp van de verbindingslijn kruist op een kaart die smaller is dan haar eigen marge. Die sloeg toe op breedte 0,5, 1 en 4 — op nul werd hij afgedekt. De ondergrens en bovengrens liggen daar rekenkundig op hetzelfde punt maar verschillen in de laatste bit, en dat was genoeg.

De cockpitoorzaak is strikt genomen geen nulbreedte-geval. De randdikte heeft een vaste pixel als vloer, dus het verschil wordt negatief op élke meter korter dan zo'n vijftien pixels — ook bij veel meters naast elkaar op een gewone dia. Dat is de enige van de vier waar een gebruikerspad naartoe zou kunnen lopen; voor de andere drie blijft de weging uit de issue staan.

Toetsen

test/preview_degenerate_width_test.dart ging van 10 naar 34: per oorzaak één toets mét de inhoud die hem uitlokt (drie tijdlijnindelingen × vier breedtes, alle zeven metertypes, de lege cockpit), plus één sweep over álle 24 slidetypes op vier ontaarde breedtes die de omgevallen types in één melding noemt. Elke toets is één keer rood gezien tegen de onherstelde code. Het onderscheid uit #784 tussen 'past niet' en 'valt om' is overgenomen.

Let op — de CI heeft dit niet gedraaid. Er is sinds taak #664 (10:25Z) geen enkele Actions-taak meer aangemaakt, ook niet voor de merge van #794 naar main. Gemerged op de lokale poort: make check groen (6300 toetsen), make check-secrets groen, make sast groen.

Gemerged: 5856984b (PR #795), op main geverifieerd. Daarmee zijn alle vier de rijen uit de tabel weg. **Wat er is gerepareerd** - `checklist`/`scopeMatrix` — `LinearProgressIndicator` eist `minHeight > 0`; die dikte was van de breedte afgeleid en krijgt nu een haarlijn als ondergrens. - `timeline` — de verdiepingstelling deelde door een van de breedte afgeleide maat (Infinity/NaN, en het afronden gooit); op zo'n breedte is één verdieping het antwoord. - `cockpit` — hoekstraal min randdikte werd negatief, wat `RRect` weigert; nu een scherpe hoek. **Twee dingen die hier niet in stonden** De tijdlijn had een *tweede* oorzaak, die pas zichtbaar werd toen de eerste weg was: de clamp van de verbindingslijn kruist op een kaart die smaller is dan haar eigen marge. Die sloeg toe op breedte 0,5, 1 en 4 — op nul werd hij afgedekt. De ondergrens en bovengrens liggen daar rekenkundig op hetzelfde punt maar verschillen in de laatste bit, en dat was genoeg. De cockpitoorzaak is strikt genomen geen nulbreedte-geval. De randdikte heeft een vaste pixel als vloer, dus het verschil wordt negatief op élke meter korter dan zo'n vijftien pixels — ook bij veel meters naast elkaar op een gewone dia. Dat is de enige van de vier waar een gebruikerspad naartoe zou kunnen lopen; voor de andere drie blijft de weging uit de issue staan. **Toetsen** `test/preview_degenerate_width_test.dart` ging van 10 naar 34: per oorzaak één toets mét de inhoud die hem uitlokt (drie tijdlijnindelingen × vier breedtes, alle zeven metertypes, de lege cockpit), plus één sweep over álle 24 slidetypes op vier ontaarde breedtes die de omgevallen types in één melding noemt. Elke toets is één keer rood gezien tegen de onherstelde code. Het onderscheid uit #784 tussen 'past niet' en 'valt om' is overgenomen. **Let op — de CI heeft dit niet gedraaid.** Er is sinds taak #664 (10:25Z) geen enkele Actions-taak meer aangemaakt, ook niet voor de merge van #794 naar main. Gemerged op de lokale poort: `make check` groen (6300 toetsen), `make check-secrets` groen, `make sast` groen.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
LibreKAT/Ocideck#782
No description provided.