Column: disposição vertical e configuração do contêiner no Compose

Autor: IT Sectr Publicado: 2026-06-28 Tempo de leitura: 8 min

Column é um componente Composable integrado do Jetpack Compose do pacote compose.foundation.layout que organiza os elementos filhos verticalmente, um abaixo do outro. Column é o equivalente ao LinearLayout com orientação vertical do antigo sistema View, mas ao contrário deste, usa uma descrição declarativa e reage automaticamente a mudanças de estado. De acordo com Google Android Developers, 2026, Column é um dos três contêineres básicos junto com Row e Box.

Pontos principais

  • Column organiza elementos verticalmente com configuração de Arrangement e Alignment
  • Arrangement define a distribuição de espaço entre os elementos verticalmente
  • Alignment define o alinhamento horizontal de cada elemento dentro da Column
  • Weight distribui o espaço livre proporcionalmente entre os elementos
  • IntrinsicSize permite que a Column ajuste seu tamanho à largura mínima/máxima dos filhos

O que é Column no Jetpack Compose

Column é uma função Composable que aceita parâmetros opcionais: modifier, verticalArrangement, horizontalAlignment e content — uma lambda com ColumnScope. Dentro da Column, as funções Composable filhas são organizadas de cima para baixo na ordem de declaração. A altura da Column é igual à soma das alturas dos filhos mais o espaço especificado por Arrangement. A largura é igual à largura máxima do filho considerando Alignment.

Column é um contêiner invisível: não tem fundo ou borda por padrão. Se precisar de um fundo, adicione Modifier.background() à própria Column. Ao contrário de LazyColumn, a Column renderiza todos os elementos filhos simultaneamente e não suporta virtualização. Isso significa que a Column é adequada apenas para conjuntos de dados pequenos — até 10-15 elementos. Para listas longas, use LazyColumn.

ColumnScope é o receiver da lambda content da Column. Ele fornece modificadores adicionais que funcionam apenas dentro da Column: weight(), align(), alignByBaseline(). Esses modificadores não fazem sentido fora da Column porque dependem das especificidades do layout vertical. Por exemplo, Modifier.align(Alignment.CenterHorizontally) alinha um elemento filho ao centro da Column horizontalmente.

Parâmetros da Column: Arrangement, Alignment, Modifier

VerticalArrangement determina como o espaço vertical é distribuído entre os elementos. Valores disponíveis: Arrangement.Top (padrão), Bottom, Center, SpaceBetween, SpaceEvenly, SpaceAround. Se a altura da Column for maior que a soma das alturas dos elementos, Arrangement distribui o espaço livre. Se os elementos ocuparem toda a altura, Arrangement não tem efeito.

HorizontalAlignment define o alinhamento horizontal de cada elemento filho. Alignment.Start (padrão para LTR), CenterHorizontally, End. Alignment atua em cada elemento independentemente: se um elemento é estreito e outro é largo, o primeiro será alinhado, o segundo pode ultrapassar os limites da Column. Alignment só funciona se a Column tiver largura fixa ou fillMaxWidth.

Modifier para Column: Column aceita um Modifier que se aplica ao próprio contêiner. Modifier.fillMaxWidth(), fillMaxHeight(), size(), padding() — todos os modificadores padrão funcionam. Nota especial: Modifier.height(IntrinsicSize.Min) força a Column a calcular a altura mínima com base nos elementos filhos usando medição Intrinsic.

kotlin
@Composable
fun ColumnArrangementDemo() {
    Column(
        modifier = Modifier.fillMaxSize().background(Color(0xFFF5F5F5)),
        verticalArrangement = Arrangement.SpaceEvenly,
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        Text("Topo", modifier = Modifier.background(Color.Cyan))
        Text("Meio", modifier = Modifier.background(Color.Magenta))
        Text("Fundo", modifier = Modifier.background(Color.Yellow))
    }
}

    // IntrinsicSize: Column ajusta a altura ao conteúdo
@Composable
fun IntrinsicColumn() {
    Column(
        modifier = Modifier
            .height(IntrinsicSize.Min)
            .width(200.dp)
    ) {
        Text("Texto curto")
        Text("Um texto muito longo que será ajustado dentro da coluna")
    }
}
ArrangementComportamento
Arrangement.TopElementos grudados no topo, espaço livre embaixo
Arrangement.CenterElementos centralizados, espaço dividido igualmente acima e abaixo
Arrangement.SpaceBetweenPrimeiro elemento no topo, último embaixo, outros uniformemente
Arrangement.SpaceEvenlyEspaços iguais entre todos os elementos e bordas
Arrangement.SpaceAroundEspaços iguais entre elementos, metade do espaço nas bordas

Column weight: distribuição de espaço entre elementos

Modifier.weight() é um modificador ColumnScope que distribui o espaço vertical livre entre os elementos da Column proporcionalmente aos pesos especificados. Se a Column ocupar 400dp de altura e os elementos filhos totalizarem 100dp, os 300dp restantes são divididos entre os elementos com weight. Um elemento com weight(2f) receberá o dobro de espaço que um elemento com weight(1f).

fill — o segundo parâmetro de weight: weight(weight: Float, fill: Boolean = true). Se fill = true (padrão), o elemento se estende por toda a altura disponível. Se fill = false, o elemento ocupa apenas sua altura intrínseca e o espaço restante fica vazio. Isso é útil quando um elemento deve estar grudado a um lado, mas weight define apenas a proporção de distribuição do espaço vazio.

Limitações do weight: weight só funciona em Column com altura fixa ou fillMaxHeight(). Se a altura da Column for determinada pelos elementos filhos (wrap content), os pesos não fazem sentido — não há espaço livre para distribuir. Além disso, weight não pode ser combinado com Modifier.height() no mesmo elemento — eles entram em conflito e weight é ignorado.

kotlin
@Composable
fun WeightedColumn() {
    Column(
        modifier = Modifier.fillMaxHeight().width(300.dp)
    ) {
        // Pega 1/6 da altura (weight 1 da soma 1+2+3=6)
        Box(
            modifier = Modifier
                .weight(1f)
                .fillMaxWidth()
                .background(Color.Red)
        )
        // Pega 2/6 da altura
        Box(
            modifier = Modifier
                .weight(2f)
                .fillMaxWidth()
                .background(Color.Green)
        )
        // Pega 3/6 da altura
        Box(
            modifier = Modifier
                .weight(3f)
                .fillMaxWidth()
                .background(Color.Blue)
        )
    }
}

Column vs LazyColumn: quando usar cada um

Column renderiza todos os elementos filhos imediatamente. Se houver mais de 10-15 elementos, a Column cria uma carga significativa na composição e medição. LazyColumn, por outro lado, renderiza apenas os elementos visíveis e reutiliza os invisíveis. Para listas longas, listas com milhares de elementos, listas infinitas ou chats — LazyColumn é obrigatório.

Quando Column é melhor: telas com formulários (3-10 campos), cartões de perfil, colunas verticais com ícones, menus. Column também suporta IntrinsicSize, útil para altura adaptativa. Além disso, Column é mais fácil de depurar — sem virtualização, todos os elementos são visíveis no Layout Inspector. Para IU estática, Column é a escolha certa.

LazyColumn fornece: cache de itens, identidade baseada em chave, animação de adicionar/remover (animateItemPlacement), cabeçalhos fixos (sticky headers). Se a lista contiver elementos de diferentes tipos (diferentes viewType), use LazyColumn com sealed class em items. Column não suporta sticky headers (eles precisam ser emulados via Column rolável). Além disso, LazyColumn suporta LazyVerticalGrid ao usar GridCells.

CritérioColumnLazyColumn
Número de elementosAté 10-15Qualquer
DesempenhoSempre renderiza todosApenas visíveis + buffer
RolagemVia Modifier.verticalScrollIntegrada
IntrinsicSizeSuportaNão suporta
Sticky headersNão (emulação)Sim (stickyHeader)
Animação de elementosNão integradaanimateItemPlacement

Exemplos práticos de uso da Column

Vamos ver uma tela de perfil de usuário onde a Column é usada como contêiner principal para o avatar, nome, bio e botões de ação. Aqui, a Column com IntrinsicSize.Min se ajusta ao conteúdo e weight é usado para distribuir espaço entre as seções.

kotlin
@Composable
fun UserProfileCard(name: String, bio: String) {
    Card(
        modifier = Modifier.fillMaxWidth().padding(16.dp),
        elevation = CardDefaults.cardElevation(defaultElevation = 4.dp)
    ) {
        Column(
            modifier = Modifier.fillMaxWidth().padding(16.dp),
            horizontalAlignment = Alignment.CenterHorizontally,
            verticalArrangement = Arrangement.spacedBy(8.dp)
        ) {
            // Avatar
            Icon(
                imageVector = Icons.Default.AccountCircle,
                contentDescription = "Avatar",
                modifier = Modifier.size(64.dp)
            )
            // Nome
            Text(name, style = MaterialTheme.typography.headlineSmall)
            // Bio
            Text(bio, style = MaterialTheme.typography.bodyMedium,
                modifier = Modifier.padding(top = 4.dp))
            // Botões de ação
            Row(
                horizontalArrangement = Arrangement.spacedBy(12.dp),
                modifier = Modifier.padding(top = 12.dp)
            ) {
                Button(onClick = { }) { Text("Mensagem") }
                OutlinedButton(onClick = { }) { Text("Seguir") }
            }
        }
    }
}

No exemplo, a Column usa Arrangement.spacedBy(8.dp) para espaçamento uniforme entre elementos. horizontalAlignment = CenterHorizontally centraliza o avatar, nome e bio. O Row dentro da Column é um contêiner aninhado para os botões em uma linha. Essa combinação de Column (disposição vertical) e Row (disposição horizontal) é um padrão típico de construção de IU no Compose.

Perguntas frequentes

Como a Column difere da LazyColumn em termos de desempenho?

Column renderiza todos os elementos filhos de uma vez, o que com 100+ elementos causa quedas de FPS. LazyColumn renderiza apenas os elementos visíveis mais um buffer (geralmente 3-5 telas). Para telas estáticas com 3-10 elementos, Column é mais rápida, pois não há sobrecarga de virtualização.

Como tornar uma Column rolável?

Adicione Modifier.verticalScroll(rememberScrollState()) à Column. Isso torna a Column rolável, mas não fornece virtualização — todos os elementos ainda são renderizados de uma vez. Para listas roláveis longas, use LazyColumn.

Posso aninhar Row dentro de Column e Column dentro de Row?

Sim, o aninhamento de Row/Column é uma prática comum. Combinando os dois contêineres, você pode construir grades complexas. No entanto, evite aninhamento profundo (4+ níveis) sem necessidade — isso aumenta o número de medições de LayoutNode e retarda a composição.

Como fazer todos os elementos na Column terem a mesma largura?

Use Modifier.fillMaxWidth() em cada elemento filho. Se a Column tiver Modifier.fillMaxWidth(), todos os filhos com fillMaxWidth() se estenderão por toda a largura. Alternativa: use Modifier.weight(1f) no ColumnScope se a Column estiver dentro de um contêiner fixo.

Como o spacedBy funciona na Column?

Arrangement.spacedBy(space) adiciona um espaço fixo entre cada dois elementos adjacentes. Ao contrário de SpaceBetween/SpaceAround, spacedBy não estica os elementos — o espaço é fixo e o espaço restante fica no final da Column. spacedBy não adiciona espaço antes do primeiro nem depois do último elemento.

Resumo

  • Column — contêiner vertical básico do Compose para organizar elementos de cima para baixo
  • Arrangement controla a distribuição de espaço (Top, Center, SpaceBetween, spacedBy)
  • Alignment define o alinhamento horizontal de cada elemento filho
  • Weight distribui o espaço livre proporcionalmente entre elementos
  • Column vs LazyColumn: Column para 3-10 elementos, LazyColumn para listas longas
  • IntrinsicSize permite que a Column ajuste a altura à medição mínima do filho
  • Recomendação: use spacedBy para espaços entre elementos em vez de padding em cada um

Vamos desenvolver um aplicativo móvel chave na mão

A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.

Discutir o projeto

Leia também