Novidades da versão de agosto de 2026 do Jetpack Compose
Leitura de 5 minutos
Hoje, a versão de agosto de 2026 do Jetpack Compose está estável. Essa versão traz a versão 1.12 nos módulos principais do Compose (consulte o mapeamento completo da BOM), apresentando APIs visuais avançadas, como gradientes de malha e suporte a uma ampla gama de cores (WCG, na sigla em inglês), recursos de layout estrutural, como áreas nomeadas no Grid, integração perfeita com o Credential Manager do Android e melhorias significativas de teste e desempenho.
Para atualizar seu projeto para a versão de hoje, faça upgrade da versão da BOM do Compose para 2026.08.00:
implementation(platform("androidx.compose:compose-bom:2026.08.00"))
Mudanças importantes
- AGP e SDK de compilação: o Compose 1.12 atualiza o compileSdk para a API 37, exigindo um AGP 9.1.2 mínimo. Lembre-se de que o Compose sempre vai segmentar o compileSdk mais recente. Saiba mais sobre essa mudança aqui.
Modifier.onFirstVisible()foi descontinuado: migre para Modifier.onVisibilityChanged(), que oferece um rastreamento mais preciso do limite de visibilidade.
Gráficos
Gradientes de malha
O Compose 1.12 apresenta MeshGradientPainter para ajudar você a criar gradientes de cores orgânicos de vários pontos.
val rows = 1 val columns = 1 val gradientPainter = remember { MeshGradientPainter(rows, columns) { // Parameters: row, column, position, color setVertex(0, 0, Offset(0f, 0f), Color.Red) // Top-Left setVertex(0, 1, Offset(1f, 0f), Color.Blue) // Top-Right setVertex(1, 0, Offset(0f, 1f), Color.Green) // Bottom-Left setVertex(1, 1, Offset(1f, 1f), Color.Yellow) // Bottom-Right } } Box( modifier = modifier .aspectRatio(16/9f) .fillMaxWidth() .paint(gradientPainter) )
Para mais informações e exemplos, consulte a documentação.
Suporte a HDR e ampla gama de cores
As telas modernas oferecem fidelidade de cores estendida e maior intervalo dinâmico. No Compose 1.12, o suporte completo ao pipeline para ampla gama de cores (P3) e renderização HDR foi ativado em gráficos, pintura e sombreadores do Compose. As cores definidas em espaços de cores não sRGB (como o Display P3) são preservadas até a renderização da plataforma sem fixação de cores. As cores vão retornar com segurança para o sRGB se usarem um espaço de cores não compatível (por exemplo, CieXyz, CieLab ou Oklab), se confiarem em um espaço de cores em uma versão do Android não compatível (por exemplo, Bt2020Hlg no Android 13 e versões anteriores) ou se o app estiver em execução no Android 9 (API 28) e versões anteriores.
Outras mudanças importantes:
LayerOutsetsfoi adicionado aGraphicsLayereModifier.graphicsLayer, que podem ser usados para aumentar os limites visuais da camada além do tamanho medido. ApliqueLayerOutsetspara evitar o comportamentoclipToBoundsimplícito quando a camada é promovida a um buffer fora da tela.
Estilos
No Google I/O, compartilhamos nossa visão inicial da API Styles do Compose, uma maneira unificada e eficiente de estilizar componentes. Desde então, continuamos a criar a arquitetura subjacente para garantir a segurança de tipo estrita e a correção previsível, além de oferecer suporte à criação de sistemas de design personalizados.
Para garantir que essa camada fundamental esteja correta, a API vai permanecer experimental, e você pode esperar mudanças importantes.
Otimizações de tempo de execução
Sobrecarga SideEffect com chave
SideEffect agora oferece suporte a argumentos de chave, que permitem acionar efeitos colaterais únicos sempre que chaves específicas mudam. Isso pode levar a um melhor desempenho em comparação com o uso de um LaunchedEffect ou DisposableEffect quando você não precisa da corrotina ou do bloco de descarte. SideEffect é até 90% mais rápido que LaunchedEffect e cerca de 20% mais rápido que DisposableEffect. O SideEffect executa o efeito antes de DisposableEffect e LaunchedEffect. Portanto, tenha cuidado ao migrar efeitos atuais para essa API, especialmente para LaunchedEffects que dependem do envio para iniciar após a conclusão do frame atual.
@Composable fun AnalyticsTracker(userId: String, screenName: String) { SideEffect(key1 = userId, key2 = screenName) { analytics.logScreenView(userId, screenName) } }
Animation
DeferredTargetAnimationsaiu do status experimental.
Transições interativas de duas fases
- Novos composables:
DeferredAnimatedContenteDeferredAnimatedVisibilitypermitem criar transições agradáveis de duas fases, por exemplo, para rastreamento de gesto de volta preditivo. - Controle manual de animação: durante a fase adiada de uma transição, as propriedades animadas (como escala ou deslocamento) agora podem ser manipuladas manualmente em tempo real (por exemplo, rastreando um gesto de deslize).
- Transferência perfeita: quando a fase adiada termina, o mecanismo de transição assume o controle e realiza uma transferência perfeita, incluindo a transferência de velocidade, para a transição automática.
- Suporte a elementos compartilhados: uma nova flag
permitTransformDuringDeferredTransitionemSharedContentConfigcontrola se os elementos compartilhados se transformam visualmente junto com os contêineres pai durante a fase de transição adiada.
val state = remember { DeferredTransitionState(initialScreen) } val transition = rememberDeferredTransition(state) if (predictiveBackInProgress) { state.defer(targetScreen) } else { state.animateTo(targetScreen) } transition.DeferredAnimatedContent( targetState = targetScreen, mutableTransformSpec = { MutableContentTransform { // Manually manipulate properties during the deferred phase initialContentTransform { scale = swipeProgress } } } ) { screen -> ScreenContent(screen) }
Confira abaixo duas demonstrações de casos de uso em que uma animação orientada por gestos é transferida para uma animação acionada:
Integrações de texto, entrada e plataforma
Formatação de texto editável
Novas APIs oferecem formatação de rich text para texto editável em BasicTextField. Agora é possível aplicar e manipular programaticamente a formatação de caracteres e parágrafos inline usando SpanStyle e ParagraphStyle pelo novo método addStyle() dentro de um escopo TextFieldBuffer (como dentro de textFieldState.edit { ... } ou uma InputTransformation). Além disso, TextFieldBuffer fornece APIs getSpanStyles() e getParagraphStyles() que retornam objetos TrackedRange, permitindo ler, atualizar ou remover estilos aplicados. Para complementar a criação de formatação, TextFieldState agora expõe uma propriedade textStyles somente leitura para consultar estilos ativos em intervalos, enquanto TextFieldBuffer fornece originalTextStyles para inspecionar o estado de formatação antes de uma edição. A formatação de texto e as anotações personalizadas são mantidas em todas as mudanças de configuração.
val state = rememberTextFieldState("Formatted text in Compose 1.12") // Apply bold and color styles to a range of text state.edit { addStyle( SpanStyle(fontWeight = FontWeight.Bold, color = Color.Blue), start = 0, end = 9 ) } // Query active styles from TextFieldState val currentStyles = state.textStyles
Seleção de texto
Uma nova SelectionState API oferece controle programático e observabilidade sobre a seleção de texto em um SelectionContainer. Ao elevar um objeto SelectionState usando rememberSelectionState() e transmiti-lo para SelectionContainer, selectedTexts é exposto como uma lista reativa de AnnotatedStrings e fornece métodos como selectAll(), clear(), select(TextRange) e extendSelectionByWord().
Além disso, use getSelectableTexts() para recuperar todos os itens de texto selecionáveis na ordem do layout e selecionar texto em funções combináveis no SelectionContainer usando um intervalo global.
@Composable fun ProgrammaticSelectionExample() { val selectionState = rememberSelectionState() Column { Button( onClick = { selectionState.selectAll() }, modifier = Modifier.disableSelectionClearOnTap() ) { Text("Select All") } SelectionContainer(state = selectionState) { Text("Text content to be selected programmatically.") } } }
Integração do Credential Manager
Os campos de texto do Compose agora são integrados nativamente ao Credential Manager do Android (API 34 e mais recentes) pelo framework de preenchimento automático (abaixo da API 34 é processado pela androidx.credentials library). Ao anexar a nova propriedade semântica credentialRequest com CredentialRequestData, as entradas de texto podem solicitar chaves de acesso, credenciais salvas ou solicitações de login diretamente no fluxo de entrada do usuário.
@Composable fun LoginField(textFieldState: TextFieldState) { val credentialData = remember { CredentialRequestData( // Specify Credential Manager request options ) } BasicTextField( state = textFieldState, modifier = Modifier.semantics { credentialRequest = credentialData } ) }
Outras mudanças importantes:
- Suporte para configurações de variação de fontes em fontes disponíveis para download.
- Rolagem automática ativada ao arrastar a seleção de texto além da janela de visualização em
SelectionContainer. - Adicionado suporte para sons de interação automática (cliques e navegação de foco) aos componentes do Compose, com uma nova
SoundEffectOnInteractionfunção combinável para permitir a desativação. Como consequência dessa mudança, os listeners de clique semântico agora precisam ser chamados na linha de execução principal, o que pode afetar um pequeno número de casos de teste. KeyboardTypeagora incluiDate,Time,DateTimeeSignedDecimal.BasicSecureTextFieldagora usaTextObfuscationMode.Systempor padrão, enquantoRevealLastTypedserve como uma substituição absoluta.
Melhorias no layout
Áreas nomeadas no layout de grade
Agora é mais fácil criar layouts 2D complexos com áreas nomeadas no componente @Experimental Grid. Em vez de gerenciar índices numéricos de coluna e linha em itens, você pode definir regiões semânticas no GridConfigurationScope e posicionar funções combináveis pelo nome da área.
@OptIn(ExperimentalGridApi::class) @Composable fun DashboardLayout() { Grid( config = { area("header", row = 0, column = 0, rowSpan = 1, columnSpan = 2) area("sidebar", row = 1, column = 0) area("content", row = 1, column = 1) gap(16.dp) } ) { HeaderSection(modifier = Modifier.gridItem(areaId = "header")) NavigationSidebar(modifier = Modifier.gridItem(areaId = "sidebar")) MainContentView(modifier = Modifier.gridItem(areaId = "content")) } }
Para mais informações, consulte a documentação.
Desempenho
Como em todas as versões, continuamos a investir no desempenho do Compose para garantir que o framework ajude você a criar apps bonitos e eficientes. Nesta versão, nos concentramos em melhorar o desempenho de inicialização e agora estamos vendo o tempo para exibição inicial (o tempo que um app leva para produzir o primeiro frame) comparável às visualizações em nossos benchmarks.
Upgrades de teste e ferramentas
Sincronização de testes
O Compose 1.12 apresenta novas APIs de teste projetadas para reduzir os tempos de execução de testes e eliminar a instabilidade durante a amostragem de estado:
hasPendingWork: verifica passivamente se a interface tem trabalho pendente sem avançar o relógio, o que é ideal para loops de animação manual.runWithoutImplicitWait: desativa temporariamente a sincronização implícita ao percorrer frames de relógio manual (por exemplo, testes de animação).
@Test fun testAnimationStateFast() { composeTestRule.mainClock.autoAdvance = false while (composeTestRule.hasPendingWork()) { composeTestRule.mainClock.advanceTimeByFrame() composeTestRule.waitForIdle() composeTestRule.runOnUiThread { composeTestRule.runWithoutImplicitWait { // This is most effective when querying multiple nodes in a single frame. // It prevents the redundant synchronization overhead that would // otherwise occur on every individual query. val box1 = composeTestRule.onNodeWithTag("Box1").fetchSemanticsNode() val box2 = composeTestRule.onNodeWithTag("Box2").fetchSemanticsNode() assertThat(box1.boundsInRoot.right).isAtMost(box2.boundsInRoot.left) } } } }
Outras mudanças importantes:
- A API
captureToImageagora permite capturar um pop-up ou caixa de diálogo junto com a âncora em um único bitmap. - Adicionado
onRootWithViewInteractionpara restringir as pesquisas semânticas do Compose a visualizações específicas do Android. Isso simplifica o teste de interfaces híbridas, comoRecyclerViews, sem exigir tags de teste exclusivas no código de produção. @PreviewWrapperanotações agora podem ser aplicadas a classes@MultiPreviewpersonalizadas, permitindo configurações de visualização reutilizáveis (como temas personalizados) em vários componentes.
Divirta-se criando!
O Compose 1.12 torna o desenvolvimento de apps mais fácil e expressivo do que nunca, com gradientes de malha, suporte a uma ampla gama de cores, fontes variáveis disponíveis para download, integração do Credential Manager e ferramentas de teste mais rápidas. Como sempre, valorizamos sua contribuição. Compartilhe seu feedback sobre essas mudanças ou o que você gostaria de ver em seguida no nosso rastreador de problemas. Divirta-se criando!
-
Novidades sobre produtosCom a introdução do Pixel 11 Pro Fold, do Pixel Watch 5 e de toda a família Pixel, os usuários estão se movendo perfeitamente em diversos tamanhos de tela, posturas exclusivas e experiências inteligentes.
-
Novidades sobre produtosHoje, comemoramos oficialmente cinco anos desde o lançamento do Jetpack Compose 1.0. Da versão 1.0, anunciada em 28 de julho de 2021, até a versão 1.11 mais recente, vimos as APIs evoluírem significativamente ao longo dos anos, e estamos aproveitando o momento para comemorar.
Rebecca Franks, Nick Butcher, Loryn Hairston • Leitura de 4 minutos -
Novidades sobre produtosNos quase cinco anos desde o lançamento do Jetpack Compose, investimos em oferecer todos os recursos, desempenho e ferramentas necessários para criar interfaces incríveis em vários dispositivos Android.
Nick Butcher • Leitura de 2 minutos
Receba os insights mais recentes sobre o desenvolvimento do Android na sua caixa de entrada semanalmente.