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 RowEn 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 mediantewidth:
SizedBox(width: 16), // Aplica correctamente 16 píxeles de separación horizontal en el RowCausa 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:
- Ausencia de espacio horizontal libre: Si el contenido suma el ancho total disponible en la pantalla o contenedor, no existe espacio sobrante que repartir.
- El widget ancestro constriñe el ancho al contenido mínimo: Si el
Rowse encuentra envuelto dentro de un widget que ajusta sus dimensiones al tamaño estricto de sus hijos (o si tienemainAxisSize: MainAxisSize.min), el ancho delRowcoincide exactamente con la suma del ancho de sus textos, eliminando cualquier margen para reubicar los elementos.