diegoRodicio

Está documentación está a túa disposición sin ningún custo económico. Sen embargo, para a súa elaboración dedico moito tempo e recursos, polo que agradecería unha colaboración co que consideres oportuno. Gracias.

View Categories

📐 Widgets Básicos de Layout

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étodoDescriciónExemplo
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ódigoResultado visual
Colors.redVermello
Colors.greenVerde
Colors.blueAzul
Colors.blackNegro
Colors.whiteBranco
Colors.amberAmarelo dourado
Colors.grey[300]Tonalidade gris clara
Colors.blue[900]Azul moi escuro

🧠 Moitas cores teñen tonalidades dispoñibles como Colors.color[100] ata Colors.color[900], onde 100 é máis claro e 900 má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).

ValorSignificado
MainAxisAlignment.startComeza no inicio do eixe
MainAxisAlignment.endColoca ao final
MainAxisAlignment.centerCentrado
MainAxisAlignment.spaceBetweenEspazo igual entre widgets, sen marxes
MainAxisAlignment.spaceAroundEspazo igual arredor de cada widget
MainAxisAlignment.spaceEvenlyEspazo 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).

ValorSignificado
CrossAxisAlignment.startAliña os widgets ao inicio do eixe cruzado
CrossAxisAlignment.endAliña os widgets ao final do eixe cruzado
CrossAxisAlignment.centerAliña os widgets ao centro do eixe cruzado
CrossAxisAlignment.stretchExpande os widgets para ocupar todo o espazo dispoñible
CrossAxisAlignment.baselineAliña segundo a liña base do texto (require textBaseline)

⚠️ baseline só funciona con widgets de texto e require especificar textBaseline: 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.

ValorPosición visual na pantalla
FloatingActionButtonLocation.centerDockedCentro inferior, integrado cunha BottomAppBar
FloatingActionButtonLocation.centerFloatCentro inferior, lixeiramente flotante
FloatingActionButtonLocation.endDockedDereita inferior, integrado cunha BottomAppBar
FloatingActionButtonLocation.endFloatDereita inferior, flotante (por defecto)
FloatingActionButtonLocation.startDockedEsquerda inferior, integrado cunha BottomAppBar
FloatingActionButtonLocation.startFloatEsquerda inferior, flotante

🧠 Usar centerDocked ou endDocked é útil cando se combina con bottomNavigationBar ou BottomAppBar.

🧪 Exemplo: #

Scaffold(
  floatingActionButton: FloatingActionButton(
    onPressed: () {},
    child: const Icon(Icons.add),
  ),
  floatingActionButtonLocation: FloatingActionButtonLocation.centerFloat,
)

📚 Recursos oficiais #

🔲 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.

PropiedadeDescriciónExemplo de uso
childO widget contido no interior do Container. Pode ser calquera outro widget: Text, Image, Row, etc.child: Text('Ola')
paddingEspazo interno entre o contido e o borde do contedor.
Valores posibles:
EdgeInsets.all(valor)
EdgeInsets.symmetric(...)
EdgeInsets.only(...)
EdgeInsets.fromLTRB(...)
padding: EdgeInsets.all(16)
marginEspazo externo entre o contedor e outros widgets ao redor.
Valores iguais aos de padding.
margin: EdgeInsets.symmetric(horizontal: 20)
colorCor 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
widthAncho do contedor en píxeles. Pode ser un número fixo ou double.infinity para ocupar todo o espazo dispoñible.width: 200
heightAltura 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 #

PropiedadeDescriciónExemplo de uso
childWidget que se coloca dentro do Padding. Pode ser calquera outro widget:
Text
Icon
Image
Column, etc.
child: Text('Exemplo')
paddingDefine 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 #

PropiedadeDescriciónExemplo de uso
childWidget 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 #

PropiedadeDescriciónExemplo de uso
childrenLista 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')]
mainAxisAlignmentAliñ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
crossAxisAlignmentAliñ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 #

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.

🔗 Ver o código en DartPad

📐 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 #

PropiedadeDescriciónExemplo de uso
childWidget que se coloca dentro de Expanded. Pode ser calquera outro widget:
Text
Container
Row
Image, etc.
child: Text('Texto expandido')
flexFactor 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: #

PropiedadeDescriciónExemplo de uso
childWidget que se coloca dentro de Flexible. Pode ser calquera widget:
Text
Container
Image, etc.
child: Text('Contido flexible')
flexProporció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
fitIndica 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.loose
fit: 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.

🔗 Ver o código en DartPad

📚 Recursos oficiais #