[Bug] Vier slidetypes vallen om bij een ontaarde layoutbreedte #782
Labels
No labels
accepted
bug
declined
docs
duplicate
enhancement
good first issue
in-progress
needs-info
privacy
security
triage
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
LibreKAT/Ocideck#782
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
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:bullets,twoBulletsInvalid argument(s): 1.0— clamp met een layout-constraint als bovengrenschecklist,scopeMatrixLinearProgressIndicator:minHeight == null || minHeight > 0timelineUnsupported operation: Infinity or NaN toIntcockpitWat al gerepareerd is
De eerste rij, plus een NaN uit
bulletScaleCap(0 / 0wanneer de corpsgrootte nul is, die alsfontSize >= 0 is not trueafgaat). Zie de takfix/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): 1zei niet wat er aan de hand was.Prioriteit dus laag, maar de reproductie is er en kost één toets.
De eerste rij is gemerged:
90a37cd3(PR #784), op main geverifieerd. Dat dektbulletsentwoBullets(de clamp met een layout-constraint als bovengrens) plus de NaN uitbulletScaleCap.Wat hier nog ligt zijn de andere drie rijen —
checklist/scopeMatrix,timelineencockpit. Reproductie: render elk type in eenSizedBox(width: 0, height: 200)en leestester.takeException();test/preview_degenerate_width_test.dartstaat 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.
Opgepakt op tak
fix/preview-nulbreedte-rest: de drie resterende oorzaken (checklist/scopeMatrix,timeline,cockpit), elk als eigen commit, entest/preview_degenerate_width_test.dartuitgebreid met het onderscheid tussen 'past niet' en 'valt om'.Gemerged:
5856984b(PR #795), op main geverifieerd. Daarmee zijn alle vier de rijen uit de tabel weg.Wat er is gerepareerd
checklist/scopeMatrix—LinearProgressIndicatoreistminHeight > 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, watRRectweigert; 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.dartging 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 checkgroen (6300 toetsen),make check-secretsgroen,make sastgroen.