Se você desenvolve com Jetpack Compose ou Compose Multiplatform, já sabe como pode ser frustrante esperar o rebuild completo da aplicação só para ver uma mudança de padding ou cor. Com o lançamento do Compose Hot Reload 1.0.0 — agora estável e empacotado no Compose Multiplatform 1.10 — esse problema acabou. Você edita o código, salva, e a UI atualiza em tempo real, sem reiniciar o app.
Neste artigo, vamos explorar como funciona, como configurar no seu projeto, e dicas práticas para extrair o máximo dessa ferramenta.
O que é o Compose Hot Reload?
O Compose Hot Reload permite que você edite código de composables e funções e veja o resultado imediatamente na aplicação em execução. Não é um preview isolado — é o app real rodando com todas as dependências, estado e dados, atualizando em tempo real conforme você salva o código.
Diferente do Live Edit do Android Studio, o Compose Hot Reload funciona em desktop com Compose Multiplatform e usa uma tecnologia mais robusta por baixo dos panos: o DCEVM (Dynamic Code Evolution Virtual Machine) do JetBrains Runtime.
Se você já usa Compose Multiplatform para desktop ou está planejando migrar, essa feature muda completamente o fluxo de desenvolvimento.
Como funciona por baixo dos panos
A mágica acontece em três etapas:
- Verificação: quando você salva o arquivo, o runtime valida os novos
.classcompilados para garantir compatibilidade - Carregamento: as classes são carregadas em um “universo paralelo” que representa o estado pós-reload
- Transferência de estado: um passo especializado de garbage collection migra objetos existentes para acomodar as novas definições de classes
O diferencial do DCEVM em relação à JVM padrão é que ele permite mudanças muito mais amplas — incluindo adicionar classes novas, modificar propriedades e remover funções — não apenas alterar o corpo de métodos existentes.
O sistema usa um mecanismo de hot vs. cold classpath: dependências remotas (bibliotecas, SDKs) ficam estáticas, enquanto o código compilado localmente é atualizado dinamicamente. Checksums são mantidos para detectar mudanças de forma eficiente.
Requisitos
Antes de começar, verifique se seu ambiente atende aos requisitos:
| Requisito | Versão mínima |
|---|---|
| Kotlin | 2.1.20+ |
| Compose Multiplatform | 1.10.0+ |
| JVM Target | Java 21 ou anterior |
| Runtime | JetBrains Runtime (JBR) |
| IDE | IntelliJ IDEA 2025.2.2+ ou Android Studio Otter 2025.2.1+ |
Se você ainda não conhece as novidades do Kotlin 2.3.20 ou do Kotlin 2.4.0 Beta, vale se atualizar — ambas as versões funcionam perfeitamente com o Hot Reload.
Configurando em um projeto novo
Se você está criando um projeto novo no IntelliJ IDEA, o setup é automático:
- File → New → Project → Kotlin Multiplatform
- Selecione o target Desktop
- Pronto — o Compose Hot Reload já vem habilitado
Nenhuma configuração adicional necessária. O plugin Gradle é adicionado automaticamente quando o projeto inclui um target desktop.
Configurando em um projeto existente
Se você tem um projeto Compose Multiplatform anterior à versão 1.10, adicione manualmente:
1. Adicione ao gradle/libs.versions.toml
[plugins]
composeHotReload = { id = "org.jetbrains.compose.hot-reload", version.ref = "composeHotReload" }
2. No build.gradle.kts do projeto raiz
plugins {
alias(libs.plugins.composeHotReload) apply false
}
3. No build.gradle.kts do módulo
plugins {
alias(libs.plugins.composeHotReload)
}
4. Adicione ao settings.gradle.kts
plugins {
id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0"
}
Se você ainda usa Groovy no Gradle, vale considerar migrar para o Kotlin DSL — o suporte ao Hot Reload é mais fluido. Confira nosso tutorial de Gradle com Kotlin para detalhes.
Usando na prática
Executando o app
No seu main.kt, configure a janela com alwaysOnTop = true para manter o app visível enquanto edita:
fun main() = application {
Window(
onCloseRequest = ::exitApplication,
alwaysOnTop = true,
title = "Meu App Kotlin",
) {
App()
}
}
Para iniciar com Hot Reload, você tem duas opções:
Via IDE: clique no ícone de Run no gutter e selecione “Run with Compose Hot Reload”
Via terminal:
./gradlew :myApp:hotRunJvm
Editando e recarregando
O fluxo é simples:
- Faça suas alterações em qualquer composable
- Salve o arquivo (⌘S no macOS, Ctrl+S no Linux/Windows)
- A UI atualiza automaticamente
Veja um exemplo prático. Suponha que você tem este composable:
@Composable
fun CartaoUsuario(nome: String) {
Card(
modifier = Modifier
.fillMaxWidth()
.padding(16.dp),
elevation = CardDefaults.cardElevation(4.dp)
) {
Column(modifier = Modifier.padding(16.dp)) {
Text(
text = "Olá, $nome!",
style = MaterialTheme.typography.headlineMedium
)
Spacer(modifier = Modifier.height(8.dp))
Text(
text = "Bem-vindo ao app",
style = MaterialTheme.typography.bodyLarge,
color = MaterialTheme.colorScheme.onSurfaceVariant
)
}
}
}
Agora mude o padding, a cor, adicione um ícone — salve e veja a mudança instantaneamente no app em execução. Sem rebuild, sem reinício.
A toolbar flutuante
Quando o app está rodando com Hot Reload, uma toolbar flutuante aparece no canto da janela mostrando:
- Status do reload: se está compilando, carregando ou pronto
- Logs: mensagens de depuração do processo de reload
- Controle manual: botão para forçar reload quando necessário
Se houver erro de compilação, ele aparece diretamente na janela do app — sem precisar voltar para a IDE para ver o stacktrace.
Preservação de estado
Uma das maiores vantagens do Hot Reload sobre simplesmente reiniciar o app é a preservação de estado. Variáveis de estado em remember e mutableStateOf são preservadas entre reloads, desde que a estrutura do composable permaneça compatível.
@Composable
fun Contador() {
var contagem by remember { mutableStateOf(0) }
Column(horizontalAlignment = Alignment.CenterHorizontally) {
Text("Contagem: $contagem", style = MaterialTheme.typography.displaySmall)
Spacer(modifier = Modifier.height(16.dp))
Button(onClick = { contagem++ }) {
Text("Incrementar")
}
}
}
Se você incrementar o contador para 15 e depois mudar o texto do botão de “Incrementar” para “Adicionar +1”, ao salvar o valor 15 será preservado. Isso é essencial para testar estados complexos — como formulários preenchidos ou listas com scroll — sem perder o progresso.
Limitações atuais
Apesar de estável, o Compose Hot Reload tem algumas limitações que você precisa conhecer:
- Apenas desktop por enquanto: suporte a Android e iOS está sendo explorado, mas ainda não disponível
- Java 21 ou anterior: projetos que usam Java 22+ precisam ajustar o target
- JetBrains Runtime obrigatório: não funciona com OpenJDK ou Oracle JDK padrão
- Mudanças estruturais profundas: alterações muito grandes (como renomear packages inteiros) podem exigir restart
Para projetos Android, o Live Edit no Android Studio continua sendo a alternativa. Mas se você usa Kotlin Multiplatform com target desktop, o Hot Reload é significativamente superior.
Compose Hot Reload vs. Live Edit vs. Preview
| Feature | Hot Reload | Live Edit | Compose Preview |
|---|---|---|---|
| App real rodando | ✅ | ✅ | ❌ |
| Preserva estado | ✅ | Parcial | ❌ |
| Sem restart | ✅ | ✅ | ✅ |
| Desktop | ✅ | ❌ | ✅ |
| Android | ❌ | ✅ | ✅ |
| Mudanças estruturais | ✅ | Limitado | ✅ |
Dicas para produtividade máxima
- Use
alwaysOnTop = truena janela para manter o app visível ao lado da IDE - Organize composables pequenos — mudanças em funções menores recarregam mais rápido
- Aproveite a preservação de estado para testar edge cases sem recriar o cenário
- Combine com Kotlin DSL para criar UIs declarativas que são fáceis de iterar
- Use scope functions como
applyealsopara configurações rápidas durante experimentação
Conclusão
O Compose Hot Reload 1.0 é um marco para o desenvolvimento com Kotlin e Compose. A capacidade de ver mudanças em tempo real, sem perder estado, transforma completamente o fluxo de trabalho — especialmente para quem desenvolve apps desktop com Compose Multiplatform.
Se você ainda não experimentou, o setup é trivial para projetos novos e simples para projetos existentes. Com o Kotlin 2.4.0 chegando com context parameters estáveis e collection literals, o ecossistema Kotlin nunca esteve tão produtivo.
Para aprender mais sobre Compose, confira nosso guia completo de Jetpack Compose e o tutorial básico. Se você também trabalha com desenvolvimento nativo de alta performance, vale conhecer como Rust e Zig abordam hot reload e build incremental em seus ecossistemas.
Perguntas Frequentes
O Compose Hot Reload funciona no Android?
Não, atualmente o Compose Hot Reload 1.0 funciona apenas em targets desktop (JVM). Para Android, use o Live Edit do Android Studio. A JetBrains está explorando suporte a outras plataformas em versões futuras.
Preciso de alguma configuração especial para usar?
Se seu projeto usa Compose Multiplatform 1.10+ com target desktop, o Hot Reload já vem habilitado automaticamente. Para projetos mais antigos, basta adicionar o plugin Gradle org.jetbrains.compose.hot-reload e sincronizar.
O estado da aplicação é preservado durante o reload?
Sim, variáveis em remember e mutableStateOf são preservadas entre reloads, desde que a estrutura do composable permaneça compatível. Isso permite testar mudanças visuais sem perder dados como formulários preenchidos ou posição de scroll.
Qual a diferença entre Hot Reload e Compose Preview?
O Hot Reload atualiza o app real em execução com todas as dependências e estado, enquanto o Preview renderiza composables isoladamente. O Hot Reload preserva estado entre edições e suporta mudanças estruturais mais amplas, como adicionar novas classes.