Expanded is een Flutter-widget die het onderliggende element dwingt om alle beschikbare ruimte in een Flex-container te vullen. Wanneer Row of Column ruimte verdelen tussen kinderen, neemt Expanded de vrije ruimte na aftrek van niet-flexibele elementen. Volgens de officiële Flutter-documentatie (2026) is Expanded een van de meest gebruikte layout-widgets: het wordt toegepast bij het procentueel indelen van interfaces, het bouwen van kaarten, lijsten en panelen. Het belangrijkste voordeel is de automatische berekening van breedte of hoogte op basis van de flex-factor zonder expliciete maataanduiding.
Belangrijkste punten
Expanded is een wrapper-widget die een child accepteert en dwingt uit te breiden om de beschikbare ruimte in een Flex-container (Row, Column, Flex) te vullen. Expanded heeft geen eigen visuele weergave — het beheert alleen de constraints die naar het onderliggende element worden doorgegeven.
Aan de basis van Expanded ligt het Flex-mechanisme dat door het Flutter-framework wordt geleverd. Wanneer Row of Column de afmetingen van hun kinderen berekenen, wijzen ze eerst ruimte toe aan niet-flexibele elementen (gewone widgets met vaste afmetingen) en verdelen de resterende ruimte tussen Expanded- en Flexible-kinderen proportioneel op basis van hun flex-factoren.
Expanded gebruikt Flexible.fit = FlexFit.tight. Dit betekent dat het kind van Expanded alle toegewezen ruimte moet innemen, zelfs als zijn eigen afmeting kleiner is. In tegenstelling tot Flexible met Fit.loose, waar het kind kleiner kan zijn dan het toegewezen gebied, rekt Expanded de inhoud dwingend op.
Conclusie: Expanded is het belangrijkste hulpmiddel voor het maken van proportionele layouts in Flutter. Gebruik het wanneer u wilt dat een element gegarandeerd alle beschikbare breedte of hoogte inneemt.
Expanded en Flexible — beide verdelen ruimte in Flex-containers, maar gedragen zich fundamenteel anders. Het verschil zit in de eigenschap fit, die bepaalt of het kind kleiner kan zijn dan de beschikbare ruimte.
Expanded heeft een strak gedragsmodel: zijn fit is gelijk aan FlexFit.tight. Dit betekent dat de onderliggende widget constraints ontvangt die gelijk zijn aan de beschikbare ruimte — niet meer, niet minder. Als het kind kleiner is, wordt het opgerekt. Als het groter is, wordt het samengedrukt. Flexible gebruikt FlexFit.loose, waardoor het onderliggende element elke grootte kan hebben binnen de toegewezen ruimte.
In de praktijk: als er zich twee Expanded met flex=1 in een Row bevinden, neemt elk precies de helft van de breedte in. Als u ze vervangt door Flexible met fit.loose, kan elk kind kleiner zijn dan de helft als zijn eigen afmeting kleiner is — de resterende ruimte blijft leeg.
Conclusie: gebruik Expanded voor strikte proportionele layouts, Flexible — wanneer het kind kleiner kan zijn dan de beschikbare ruimte. Als u niet zeker bent — begin met Expanded, het geeft voorspelbaarder gedrag.
Flex-factor (parameter flex) — een numerieke waarde die het deel van de beschikbare ruimte bepaalt dat Expanded krijgt. Standaard is flex=1, wat gelijke verdeling over alle Expanded-kinderen betekent.
Het verdelingsalgoritme werkt in drie stappen. Eerste: Flutter berekent de intrinsic size van alle niet-flexibele kinderen. Tweede: de resterende ruimte wordt gedeeld door de som van alle flex-factoren. Derde: elk Expanded krijgt een deel gelijk aan zijn flex-factor vermenigvuldigd met de grootte van één flex-eenheid.
Bijvoorbeeld, een Row van 300px breed bevat twee Expanded: eerste met flex=2, tweede met flex=1. De vrije ruimte (300px minus niet-flexibele kinderen) wordt in 3 delen verdeeld. De eerste krijgt 2/3, de tweede — 1/3. Als er geen niet-flexibele kinderen zijn, krijgt de eerste 200px, de tweede — 100px.
Flex-factor kan elk positief geheel getal zijn. De waarde 0 is een speciaal geval: Expanded met flex=0 gedraagt zich als een gewone niet-flexibele widget en neemt minimale ruimte in op basis van de grootte van het kind. Dit gedrag is gelijk aan de afwezigheid van Expanded.
Conclusie: flex-factor is de sleutel tot het bouwen van flexibele layouts. Gebruik verhoudingen 1:1 voor gelijke kolommen, 2:1 voor panelen met een hoofd- en zijgebied, 3:1 voor interfaces met smalle navigatie.
Voorbeeld 1 demonstreert het basisgebruik van Expanded in Row voor het maken van drie gelijke kolommen.
Row(
children: [
Expanded(
child: Container(
color: Colors.red,
),
),
Expanded(
child: Container(
color: Colors.green,
),
),
Expanded(
child: Container(
color: Colors.blue,
),
),
],
)
In dit voorbeeld verdelen drie Expanded met flex=1 (standaard) de breedte van Row gelijkmatig. De containers rekken uit tot de volledige hoogte ingesteld door Row en nemen gelijke delen in. Deze benadering is handig voor het maken van kolomlayouts met proportionele verdeling.
Voorbeeld 2 toont het gebruik van verschillende flex-factoren voor het maken van een layout met een zijpaneel en hoofdinhoud.
Row(
children: [
Expanded(
flex: 1,
child: Container(
color: Colors.grey.200,
child: const Center(
child: Text('Zijpaneel'),
),
),
),
Expanded(
flex: 3,
child: Container(
color: Colors.white,
child: const Center(
child: Text('Inhoudsgebied'),
),
),
),
],
)
Het tweede voorbeeld creëert een typische layout met een zijpaneel (25%) en hoofdgebied (75%). flex=1 en flex=3 geven de verhouding 1:3. Bij verandering van de schermbreedte worden de verhoudingen automatisch behouden — dit is de basis van adaptieve interfaces.
Conclusie: Expanded met verschillende flex-factoren is het standaardinstrument voor het bouwen van adaptieve layouts. Combinatie van Expanded in Column maakt zowel horizontale als verticale proportionele indelingen mogelijk.
Fout 1: gebruik van Expanded buiten Row, Column of Flex. Als u Expanded rechtstreeks in Stack, ListView of een andere container plaatst die geen Flex is, gooit Flutter een LayoutException met de melding „Expanded widgets must be placed inside Flex widgets”. Oplossing: controleer de bovenliggende widget — alleen Row, Column of Flex.
Fout 2: plaatsen van Expanded in ListView zonder shrinkWrap op te geven. ListView heeft standaard oneindige hoogte in de richting van scrollen en Expanded kan zijn aandeel niet berekenen. Oplossing: gebruik shrinkWrap: true of wikkel ListView in een SizedBox met vaste hoogte.
Fout 3: meerdere Expanded met totale flex die de beschikbare ruimte overschrijdt. Als er zich in een Row met beperkte breedte Expanded bevinden, evenals widgets met grote intrinsic size, kan er overflow optreden. Oplossing: controleer de minimale afmetingen van niet-flexibele kinderen en gebruik indien nodig FittedBox of Flex fit.
Fout 4: geneste Expanded in Column binnen Row. Als Expanded in Column een andere Expanded in Row bevat, kan er een conflict van constraints ontstaan. Oplossing: beperk de nestdiepte of gebruik ConstrainedBox voor expliciete maataanduiding op tussenliggende niveaus.
Conclusie: Expanded vereist de juiste bovenliggende context. Controleer altijd dat Expanded zich direct in Row, Column of Flex bevindt en vermijd nesting zonder expliciete afmetingen.
Veelgestelde vragen
SizedBox.expand rekt het kind dwingend op tot de afmetingen bepaald door externe constraints, maar neemt niet deel aan flex-verdeling. Expanded werkt alleen binnen Flex-containers en houdt rekening met de flex-factor bij het verdelen van vrije ruimte tussen kinderen.
Nee. Stack is geen Flex-container en het gebruik van Expanded erin veroorzaakt LayoutException. Voor het oprekken van kinderen in Stack gebruikt u Positioned.fill of BoxConstraints.expand.
Standaard is flex=1. Alle Expanded zonder expliciete flex krijgen gelijke delen van de vrije ruimte. Als er drie Expanded zonder flex in een Row zijn, neemt elk precies een derde van de beschikbare ruimte in.
Plaats Expanded in een Row voor horizontaal oprekken. Voor verticaal oprekken gebruikt u Expanded in Column. Als u afmetingen wilt beperken, wikkel dan Expanded of zijn kind in een SizedBox.
Expanded werkt met Flex, inclusief Row en Column als subklassen. Wrap is geen Flex-container en ondersteunt Expanded niet. Voor het verdelen van ruimte in Wrap gebruikt u andere methoden, zoals RunAlignment.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook