¿Por qué Column no obedece? La maldición de la centración en Jetpack Compose
\n¿Alguna vez te has sentado por la noche con una taza de café, escribiendo código en Kotlin para Jetpack Compose, y de repente te has dado cuenta de que tu Column se niega obstinadamente a centrar el contenido? Añades Modifier.align(Alignment.CenterHorizontally) — y el texto sigue pegado al borde izquierdo. ¿Te suena?
Este problema es todo un éxito en Stack Overflow. Miles de desarrolladores (y yo entre ellos) se han golpeado la cabeza contra la pantalla tratando de entender dónde quedó el "gravity center". En este artículo analizaremos los principales errores que convierten tu Column en una lista incontrolable, y aprenderemos a evitarlos. Prepárate: habrá mucho código, ejemplos prácticos y nada de rodeos.
\n\nError n.º 1: Confusión entre Column y Row
\nEl primer y más común error es trasladar hábitos del Android XML clásico. Allí, LinearLayout tenía el atributo gravity="center". En Compose es diferente.
Diferencia clave: Column coloca los elementos verticalmente. Por lo tanto, "centrar horizontalmente" no es una propiedad de la propia Column, sino el comportamiento de sus elementos hijos. Si escribes:
Column(\n modifier = Modifier.fillMaxSize(),\n horizontalAlignment = Alignment.CenterHorizontally\n) {\n Text("¡Hola, mundo!")\n}\nAquí horizontalAlignment funciona, pero solo si el propio Text no está limitado en ancho. Y si tienes Modifier.fillMaxWidth() en el elemento hijo, la centración se rompe. ¿Por qué? Porque el elemento se estira a todo lo ancho, y ya no hay nada que centrar dentro de él.
Error n.º 2: Modifier.align() en lugar de horizontalAlignment
\nAquí tienes el clásico código-trampa que circula por Stack Overflow:
\nColumn(\n modifier = Modifier.fillMaxSize()\n) {\n Text(\n text = "Debería estar centrado",\n modifier = Modifier.align(Alignment.CenterHorizontally)\n )\n}\nA primera vista, parece lógico. Pero esto no funcionará si Column no tiene definido horizontalAlignment. El problema es que Modifier.align() es un modificador para Box y ColumnScope. Está disponible solo dentro de Column, pero funciona en conjunto con horizontalAlignment. Si este último no se especifica, align simplemente se ignora.
Cómo solucionarlo:
\nColumn(\n modifier = Modifier.fillMaxSize(),\n horizontalAlignment = Alignment.CenterHorizontally // ¡obligatorio!\n) {\n Text(\n text = "Ahora estoy centrado",\n modifier = Modifier.align(Alignment.CenterHorizontally) // opcional\n )\n}\n\nError n.º 3: Olvidar Arrangement para la vertical
\nA menudo los desarrolladores quieren centrar el contenido de Column verticalmente (en el eje Y). Aquí entra en juego verticalArrangement:
Column(\n modifier = Modifier.fillMaxSize(),\n verticalArrangement = Arrangement.Center,\n horizontalAlignment = Alignment.CenterHorizontally\n) {\n Text("Centro del universo")\n Button(onClick = { }) { Text("Botón") }\n}\nPero hay un matiz: Arrangement.Center solo funcionará si Column ocupa toda la altura de la pantalla (Modifier.fillMaxSize() o Modifier.height(IntrinsicSize.Min)). Si la altura de Column es igual a la suma de las alturas de los elementos hijos, no habrá espacio para centrar.
Error n.º 4: IntrinsicSize y comportamiento inesperado
\nA veces añades Modifier.height(IntrinsicSize.Min) para que Column se ajuste al contenido. Y entonces la centración vertical se rompe:
Column(\n modifier = Modifier\n .fillMaxWidth()\n .height(IntrinsicSize.Min),\n verticalArrangement = Arrangement.Center\n) {\n Text("Texto 1")\n Text("Texto 2")\n}\nProblema:
Blogs
Book Recommendations
Leer también
Optimización del rendimiento de aplicaciones Swift: consejos y ejemplos
Cómo enviar peticiones HTTP con requests en Python
Domain-Driven Design en Java: no solo teoría, sino código vivo
CLI en PHP: crea herramientas de consola desde cero
Programación de redes en Rust: escribiendo un servidor TCP rápido y seguro