- 🎯 Obxectos clave: EdgeInsets, Colors, MainAxisAlignment, CrossAxisAlignment, FloatingActionButtonLocation
- 🔲 Container, Padding, Center, Row, Column
- 📐 Expanded e Flexible
- 📚 Recursos oficiais
Os widgets de layout son esenciais en Flutter para organizar e posicionar os elementos da interface de usuario. Son como os “contedores” ou “organizadores” que definen como se distribúen os teus widgets visuais na pantalla.
🎯 Obxectos clave: EdgeInsets, Colors, MainAxisAlignment, CrossAxisAlignment, FloatingActionButtonLocation #
Moitas propiedades en Flutter (como padding, margin, color, mainAxisAlignment, etc.) precisan obxectos especiais para funcionar correctamente. Aquí explicamos os máis habituais.
📏 EdgeInsets: Definir marxes e espazos interiores #
EdgeInsets é unha clase que se usa para indicar espazos arredor dun widget, ben sexa:
padding→ espazo interno (dentro do widget)margin→ espazo externo (fora do widget)
📌 Métodos máis usados #
| Método | Descrición | Exemplo |
|---|---|---|
EdgeInsets.all(valor) | Aplica o mesmo espazo (marxe ou recheo) en tódolos lados: • superior • inferior • esquerdo • dereito | EdgeInsets.all(16) |
EdgeInsets.symmetric(...) | Aplica espazo de forma simétrica: • horizontal: esquerda e dereita• vertical: arriba e abaixo | EdgeInsets.symmetric(horizontal: 20) |
EdgeInsets.only(...) | Aplica espazo só nos lados indicados. Podes especificar calquera combinación de: • top, bottom, left, right | EdgeInsets.only(top: 8, left: 12) |
EdgeInsets.fromLTRB(l, t, r, b) | Define marxes individualmente para: • l: esquerda (left)• t: arriba (top)• r: dereita (right)• b: abaixo (bottom) | EdgeInsets.fromLTRB(10, 20, 10, 0) |
🧪 Exemplo completo: #
Container(
margin: EdgeInsets.all(20),
padding: EdgeInsets.symmetric(horizontal: 12),
color: Colors.green,
child: const Text('Exemplo con EdgeInsets'),
)
🎨 Colors: Paleta de cores predefinida #
Flutter proporciona un conxunto de cores xa definidas a través da clase Colors.
📌 Cores máis comúns: #
| Código | Resultado visual |
|---|---|
Colors.red | Vermello |
Colors.green | Verde |
Colors.blue | Azul |
Colors.black | Negro |
Colors.white | Branco |
Colors.amber | Amarelo dourado |
Colors.grey[300] | Tonalidade gris clara |
Colors.blue[900] | Azul moi escuro |
🧠 Moitas cores teñen tonalidades dispoñibles como
Colors.color[100]ataColors.color[900], onde100é máis claro e900máis escuro.
🧪 Exemplo de uso: #
Container(
width: 150,
height: 80,
color: Colors.orange[300],
child: const Center(
child: Text('Cor de fondo personalizada'),
),
)
🧭 MainAxisAlignment: Aliñamento no eixe principal #
Controla como se distribúen os widgets fillos no eixe principal
(horizontal en Row, vertical en Column).
| Valor | Significado |
|---|---|
MainAxisAlignment.start | Comeza no inicio do eixe |
MainAxisAlignment.end | Coloca ao final |
MainAxisAlignment.center | Centrado |
MainAxisAlignment.spaceBetween | Espazo igual entre widgets, sen marxes |
MainAxisAlignment.spaceAround | Espazo igual arredor de cada widget |
MainAxisAlignment.spaceEvenly | Espazo igual entre todos, incluíndo extremos |
🧪 Exemplo: #
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: const [
Text('A'),
Text('B'),
Text('C'),
],
)
🎯 CrossAxisAlignment: Aliñamento no eixe cruzado #
Controla como se aliñan os widgets fillos no eixe cruzado
(vertical en Row, horizontal en Column).
| Valor | Significado |
|---|---|
CrossAxisAlignment.start | Aliña os widgets ao inicio do eixe cruzado |
CrossAxisAlignment.end | Aliña os widgets ao final do eixe cruzado |
CrossAxisAlignment.center | Aliña os widgets ao centro do eixe cruzado |
CrossAxisAlignment.stretch | Expande os widgets para ocupar todo o espazo dispoñible |
CrossAxisAlignment.baseline | Aliña segundo a liña base do texto (require textBaseline) |
⚠️
baselinesó funciona con widgets de texto e require especificartextBaseline: TextBaseline.alphabetic.
🧪 Exemplo: #
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: const [
Text('Primeiro'),
Text('Segundo con texto máis longo'),
Text('Terceiro'),
],
)
🧭 FloatingActionButtonLocation: Posición do botón flotante #
Controla a posición do botón de acción flotante (floatingActionButton) dentro dun Scaffold.
| Valor | Posición visual na pantalla |
|---|---|
FloatingActionButtonLocation.centerDocked | Centro inferior, integrado cunha BottomAppBar |
FloatingActionButtonLocation.centerFloat | Centro inferior, lixeiramente flotante |
FloatingActionButtonLocation.endDocked | Dereita inferior, integrado cunha BottomAppBar |
FloatingActionButtonLocation.endFloat | Dereita inferior, flotante (por defecto) |
FloatingActionButtonLocation.startDocked | Esquerda inferior, integrado cunha BottomAppBar |
FloatingActionButtonLocation.startFloat | Esquerda inferior, flotante |
🧠 Usar
centerDockedouendDockedé útil cando se combina conbottomNavigationBarouBottomAppBar.
🧪 Exemplo: #
Scaffold(
floatingActionButton: FloatingActionButton(
onPressed: () {},
child: const Icon(Icons.add),
),
floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
)
📚 Recursos oficiais #
- 📏 EdgeInsets – Flutter API
- 🎨 Colors – Flutter API
- 🧭 MainAxisAlignment – Flutter API
- 🎯 CrossAxisAlignment – Flutter API
- ⚡ FloatingActionButtonLocation – Flutter API
🔲 Container, Padding, Center, Row, Column #
Estes son algúns dos widgets de layout máis utilizados en Flutter.
🔹 Container #
Un contedor básico que pode ter tamaño, marxe, cor de fondo, bordes, etc.
| Propiedade | Descrición | Exemplo de uso |
|---|---|---|
child | O widget contido no interior do Container. Pode ser calquera outro widget: Text, Image, Row, etc. | child: Text('Ola') |
padding | Espazo interno entre o contido e o borde do contedor. Valores posibles: • EdgeInsets.all(valor)• EdgeInsets.symmetric(...)• EdgeInsets.only(...)• EdgeInsets.fromLTRB(...) | padding: EdgeInsets.all(16) |
margin | Espazo externo entre o contedor e outros widgets ao redor. Valores iguais aos de padding. | margin: EdgeInsets.symmetric(horizontal: 20) |
color | Cor de fondo do contedor. Requírese que non se use decoration ao mesmo tempo (ou que estea nulo).Usa cores como: • Colors.blue• Colors.red.shade100 | color: Colors.blue |
width | Ancho do contedor en píxeles. Pode ser un número fixo ou double.infinity para ocupar todo o espazo dispoñible. | width: 200 |
height | Altura do contedor en píxeles. Igual que width, pode ser fixo ou dinámico. | height: 100 |

Container(
width: 200,
height: 100,
color: Colors.amber,
child: const Center(
child: Text('Dentro dun contedor'),
),
)
🔹 Padding #
Engade espazo ao redor doutro widget (non afecta ao seu tamaño interno).
🔲 Propiedades do widget Padding #
| Propiedade | Descrición | Exemplo de uso |
|---|---|---|
child | Widget que se coloca dentro do Padding. Pode ser calquera outro widget:• Text• Icon• Image• Column, etc. | child: Text('Exemplo') |
padding | Define o espazo interno arredor do child. Usa obxectos EdgeInsets, como:• EdgeInsets.all(valor)• EdgeInsets.symmetric(...)• EdgeInsets.only(...)• EdgeInsets.fromLTRB(...) | padding: EdgeInsets.all(16) |

Padding(
padding: const EdgeInsets.all(16.0),
child: Text('Con marxe interior de 16 en todos os lados')
)
🔹 Center #
Este widget centra ao seu único fillo tanto horizontal como verticalmente dentro do espazo dispoñible para el.
🎯 Propiedade do widget Center #
| Propiedade | Descrición | Exemplo de uso |
|---|---|---|
child | Widget que se coloca dentro do widget pai. Pode ser calquera outro widget como: • Text• Icon• Column• Image, etc. | child: Text('Texto centrado') |
Center(
child: Text('Texto centrado'),
)
🔹 Row e Column #
Un widget que organiza os seus fillos (unha lista de widgets) nunha única fila horizontal (Row) ou columna vertical (Column).
📐 Propiedades dos widgets Row e Column #
| Propiedade | Descrición | Exemplo de uso |
|---|---|---|
children | Lista de widgets que se colocan dentro da Row ou Column. A orde importa.Defínese entre corchetes [...], separados por comas. | children: [Text('A'), Text('B')] |
mainAxisAlignment | Aliñación dos elementos no eixe principal: • start – Comezo• center – Centrado• end – Final• spaceBetween – Espazo entre• spaceAround – Espazo arredor• spaceEvenly – Espazo uniforme | mainAxisAlignment: MainAxisAlignment.center |
crossAxisAlignment | Aliñación dos elementos no eixe cruzado: • start – Comezo• center – Centrado• end – Final• stretch – Estirado• baseline – Alineado a unha liña base (só en Row) | crossAxisAlignment: CrossAxisAlignment.start |

// Exemplo con Row
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: const [
Icon(Icons.star),
Icon(Icons.star_border),
Icon(Icons.star_half),
],
)
// Exemplo con Column
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: const [
Text('Elemento 1'),
Text('Elemento 2'),
],
)
📚 Recursos oficiais #
- Widgets de Layout en Flutter: https://docs.flutter.dev/ui/widgets/layout
Container: https://api.flutter.dev/flutter/widgets/Container-class.htmlPadding: https://api.flutter.dev/flutter/widgets/Padding-class.htmlCenter: https://api.flutter.dev/flutter/widgets/Center-class.htmlRow: https://api.flutter.dev/flutter/widgets/Row-class.htmlColumn: https://api.flutter.dev/flutter/widgets/Column-class.html
Exemplo práctico: Combinando Contedores e Aliñación #
Imos crear unha pantalla que use Container, Padding, Center, Row e Column para organizar elementos básicos.

📐 Expanded e Flexible #
Estes widgets úsanse dentro de Row ou Column para controlar como se distribúe o espazo entre fillos.
🔹 Expanded #
Ocupa todo o espazo dispoñible restante. Útil para dividir o espazo de forma proporcional.
Se hai varios Expanded widgets, o espazo divídese entre eles.
📏 Propiedades do widget Expanded #
| Propiedade | Descrición | Exemplo de uso |
|---|---|---|
child | Widget que se coloca dentro de Expanded. Pode ser calquera outro widget:• Text• Container• Row• Image, etc. | child: Text('Texto expandido') |
flex | Factor de expansión que determina a proporción do espazo dispoñible que ocupa en relación a outros widgets Expanded no mesmo Row ou Column.• Valor enteiro • Por defecto: 1• Exemplo: flex: 2 ocuparía o dobre que un con flex: 1 | flex: 2 |

Row(
children: const [
Expanded(
child: Text('Ocupa metade', textAlign: TextAlign.center),
),
Expanded(
child: Text('E esta tamén', textAlign: TextAlign.center),
),
],
)
🔹 Flexible #
Semellante a Expanded, pero permite que o fillo non ocupe todo o espazo, se non é necesario.
📏 Propiedades do widget Flexible: #
| Propiedade | Descrición | Exemplo de uso |
|---|---|---|
child | Widget que se coloca dentro de Flexible. Pode ser calquera widget: • Text• Container• Image, etc. | child: Text('Contido flexible') |
flex | Proporción relativa do espazo que ocupa respecto aos demais Flexible dentro do mesmo Row ou Column.• Valor enteiro (por defecto: 1) • Un flex: 2 ocupa o dobre que un flex: 1 | flex: 2 |
fit | Indica se o child debe axustarse completamente ao espazo dispoñible (tight) ou ocupar só o necesario (loose).• FlexFit.tight – forza a ocupar todo o espazo dispoñible• FlexFit.loose – deixa ao fillo decidir canto espazo precisa | fit: FlexFit.loosefit: FlexFit.tight |

Row(
children: const [
Flexible(
fit: FlexFit.loose,
child: Text('Contido flexible'),
),
Flexible(
fit: FlexFit.tight,
child: Text('Este tenta ocupar máis espazo'),
),
],
)
📚 Recursos oficiais #
Exemplo práctico: Distribución de espazo con Expanded e Flexible #
Imos crear unha Row onde os elementos se distribúen utilizando Expanded e Flexible.
