wasey-rao/kmp-edge-to-edge

Layout edge-to-edge no Compose Multiplatform para Android e iOS – ativação por plataforma, WindowInsets com Scaffold, listas, barras inferiores, teclado (IME), recortes da tela, contraste dos ícones da barra de sistema e banners de anúncios nas bordas. Use ao construir qualquer tela com scaffold, corrigir conteúdo escondido atrás da barra de status, barra de navegação, notch ou teclado, ou ao direcionar Android 15 e superior.

O que é kmp-edge-to-edge?

Este skill configura layout edge-to-edge (borda a borda) para aplicativos Compose Multiplatform, garantindo que os backgrounds preencham toda a tela enquanto o conteúdo e os controles respeitam as áreas seguras (insets) do sistema. No Android, ele ativa `enableEdgeToEdge()` antes do `setContent` e define `android:windowSoftInputMode=adjustResize` para que o teclado (IME) ajuste o layout. No iOS, usa `ignoresSafeArea()` para que o Compose receba as insets corretas. O Scaffold do Material 3 lida automaticamente com o padding da barra de status e navegação, mas você deve sempre usar `innerPadding` em listas e outros conteúdos. Para telas sem Scaffold, use `WindowInsets.safeDrawing` para cobrir barra de status, barra de navegação, recortes e teclado. O skill também cobre contraste dos ícones da barra de sistema (chamando `enableEdgeToEdge` com `SystemBarStyle` apropriados), posicionamento de banners de anúncios dentro do slot `bottomBar` do Scaffold, e fornece uma checklist para garantir que nenhum texto ou controle fique oculto atrás das barras ou do teclado. Ideal para desenvolvedores que querem compatibilidade com Android 15+ e layouts nativos para iOS, evitando problemas de conteúdo cortado e duplicação de insets.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/wasey-rao/kmp-agent-studio/tree/HEAD/kmp-studio/skills/kmp-edge-to-edge

Installed? Explore more Programação e Desenvolvimento skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

Edge-to-edge no Compose Multiplatform

O Android exige edge-to-edge para aplicativos que visam SDK 35 ou superior, e a opção de desativar desaparece no SDK 36. Aplicativos iOS devem desenhar sob a barra de status e o indicador de início (home indicator). Construa cada tela edge-to-edge desde o início.

A regra: backgrounds desenham atrás das barras do sistema; conteúdo e controles são preenchidos com insets.

Ativação

Android (MainActivity em androidApp), antes de setContent:

override fun onCreate(savedInstanceState: Bundle?) {
    enableEdgeToEdge()
    super.onCreate(savedInstanceState)
    setContent { App() }
}

No manifesto, defina android:windowSoftInputMode="adjustResize" na Activity para que as insets do IME cheguem ao Compose.

iOS (ContentView.swift): deixe o Compose dono de toda a tela, caso contrário o SwiftUI aplica as áreas seguras primeiro e o Compose vê insets zero.

ComposeView().ignoresSafeArea()

O Scaffold faz a maior parte do trabalho

Scaffold(
    topBar = { TopAppBar(title = { Text(title) }) },          // preenche a si mesmo para a barra de status
    bottomBar = { NavigationBar { /* ... */ } },              // preenche a si mesmo para a barra de navegação
) { innerPadding ->
    LazyColumn(
        contentPadding = innerPadding,                         // conteúdo rola sob as barras
        modifier = Modifier.fillMaxSize(),
    ) { /* items */ }
}
  • Sempre use innerPadding. Para listas, passe-o como contentPadding para que os itens rolem atrás de barras translúcidas; para conteúdo não rolável, use Modifier.padding(innerPadding).
  • Barras do Material 3 consomem suas próprias insets. Não adicione statusBarsPadding() sobre um TopAppBar.
  • Scaffolds aninhados dobram o padding. Dê ao scaffold interno contentWindowInsets = WindowInsets(0) ou aplique consumeWindowInsets(innerPadding) no conteúdo externo.

Telas sem Scaffold

Box(Modifier.fillMaxSize().background(MaterialTheme.colorScheme.background)) {   // background preenche a tela
    Column(Modifier.fillMaxSize().windowInsetsPadding(WindowInsets.safeDrawing)) { /* conteúdo */ }
}

WindowInsets.safeDrawing cobre barra de status, barra de navegação, recorte da tela e teclado. Use safeContent quando gestos forem importantes. Aplique o padding de insets uma vez, no nível que é dono do conteúdo, nunca no pai e no filho.

Teclado

  • Telas com entrada: Modifier.imePadding() no container rolável, ou safeDrawing que já inclui o IME.
  • Um botão inferior que deve ficar acima do teclado: coloque-o no slot bottomBar do Scaffold com Modifier.imePadding(), ou use WindowInsets.ime.union(WindowInsets.navigationBars).
  • Torne o conteúdo rolável para que um campo focado possa aparecer.

Conteúdo sangrado (full-bleed)

Imagens, mapas, vídeos e prévias de câmera devem ignorar as insets e preencher a tela. Sobrepomos controles e aplicamos padding apenas neles com WindowInsets.safeDrawing.

Contraste dos ícones da barra de sistema

As barras são transparentes, então o contraste dos ícones é sua responsabilidade. No Android, enableEdgeToEdge() escolhe ícones claros ou escuros baseados no tema do sistema; se o app tiver seu próprio interruptor de tema, chame-o novamente com SystemBarStyle correspondentes quando o tema mudar. Com navegação de três botões, o Android adiciona um scrim translúcido; mantenha-o a menos que a barra inferior já forneça um fundo sólido.

Banners de anúncios

Um banner inferior deve ficar dentro do slot bottomBar do Scaffold, acima da inset da barra de navegação, com sua altura reservada para que o conteúdo não pule. Nunca deixe um banner sob a barra de gestos ou sobrepor controles de navegação; isso é tanto um bug de layout quanto um problema de política de anúncios.

Checklist para cada tela

  • O background alcança as bordas física superior e inferior.
  • Nenhum texto ou controle sob a barra de status, recorte, barra de navegação ou indicador de início.
  • O último item da lista pode rolar completamente acima da barra inferior.
  • Campos de texto focados permanecem visíveis com o teclado aberto.
  • Parece correto em paisagem (recorte na lateral) e no tema escuro.
  • As insets são aplicadas uma vez, não duplicadas.

Se o skill edge-to-edge do Google estiver instalado, use-o para solução de problemas específicos do Android além deste.

Habilidades Relacionadas