Ir al contenido

Guía de Flutter para novatos - Miguel Páramos

FAQ sobre Flutter pal que no tiene ni idea de Flutter | 2º DAM · PMDM

Problemas clásicos en un Row : por qué SizedBox(height: 16) no separa horizontalmente y por qué MainAxisAlignment parece no hacer efecto

Al comenzar a maquetar con el widget Row, es común encontrarse con comportamientos inesperados de espaciado o alineación, como en el siguiente fragmento:

child: Row( // Fila horizontal
mainAxisAlignment: MainAxisAlignment.center, // Intento de centrado en el eje horizontal
children: [ // Widgets hijos
Text('Hello, World!'), // Primer texto de la fila
SizedBox(height: 16), // Error: height no crea espacio horizontal en una fila (Row)
Text('Welcome to Flutter.'), // Segundo texto pegado al primero
], // Fin de la lista children
), // Fin del widget Row

En este escenario suelen presentarse dos dudas recurrentes: ¿por qué el SizedBox no genera separación entre los textos? y ¿por qué las distintas opciones de MainAxisAlignment parecen no alterar la apariencia del layout?

Causa 1: Usar height en lugar de width en una fila

Sección titulada «Causa 1: Usar height en lugar de width en una fila»
  • En un widget Row, el eje principal (main axis) discurre de forma horizontal (de izquierda a derecha, sobre el eje X).
  • Al indicar SizedBox(height: 16), se define un tamaño de 16 píxeles de altura (eje vertical), pero cero píxeles de anchura.
  • En consecuencia, en el eje horizontal los dos textos continúan completamente pegados.
  • Solución: En una fila (Row) el espaciado horizontal se define mediante width:
SizedBox(width: 16), // Aplica correctamente 16 píxeles de separación horizontal en el Row

Causa 2: Por qué MainAxisAlignment puede parecer inerte

Sección titulada «Causa 2: Por qué MainAxisAlignment puede parecer inerte»

La propiedad MainAxisAlignment en un Row distribuye exclusivamente el espacio sobrante o libre horizontal. Si cambiar esta propiedad entre center, start, end o spaceBetween no produce ningún cambio visual, se debe habitualmente a una de estas dos razones:

  1. Ausencia de espacio horizontal libre: Si el contenido suma el ancho total disponible en la pantalla o contenedor, no existe espacio sobrante que repartir.
  2. El widget ancestro constriñe el ancho al contenido mínimo: Si el Row se encuentra envuelto dentro de un widget que ajusta sus dimensiones al tamaño estricto de sus hijos (o si tiene mainAxisSize: MainAxisSize.min), el ancho del Row coincide exactamente con la suma del ancho de sus textos, eliminando cualquier margen para reubicar los elementos.