Hot Restart é um mecanismo de recarga rápida de um aplicativo móvel durante o desenvolvimento, no qual o aplicativo é completamente reiniciado com o código fonte atualizado. Ao contrário de uma recompilação completa, o Hot Restart usa código binário já compilado e recarrega apenas a Dart VM, reduzindo o tempo do ciclo de desenvolvimento. De acordo com a documentação do Flutter (2025), um Hot Restart típico leva de 1 a 3 segundos. Hot Restart é especialmente útil ao alterar o estado global do aplicativo e o código de inicialização.
Pontos principais
Hot Restart é um mecanismo de desenvolvimento no qual o aplicativo é completamente recarregado com código fonte atualizado sem a necessidade de uma recompilação completa do projeto. O desenvolvedor faz alterações no código, salva o arquivo e envia um comando de reinicialização através da IDE. O aplicativo recompila os arquivos alterados, reinicia a Dart VM e percorre todo o ciclo de vida desde main até a renderização final da interface do usuário.
Hot Restart difere de uma reconstrução completa por usar bibliotecas binárias já compiladas e o framework Flutter sem recompilar os wrappers nativos. Isso reduz o tempo do ciclo de desenvolvimento de vários minutos para vários segundos. De acordo com uma pesquisa de desenvolvedores Flutter (2024), o tempo médio de Hot Restart é de 2,1 segundos, aproximadamente 97% mais rápido que uma reconstrução completa do projeto através do comando flutter build.
O mecanismo é especialmente demandado no desenvolvimento de interfaces de usuário que exigem verificação frequente de alterações visuais. O desenvolvedor pode alterar a cor, tamanho ou posição de um elemento e ver instantaneamente o resultado em um simulador ou dispositivo físico sem perder o contexto de desenvolvimento por uma compilação longa. Isso acelera radicalmente a prototipagem iterativa.
Ao executar um comando Hot Restart, ocorre uma sequência de operações: salvar arquivos alterados, compilação incremental dos arquivos Dart alterados em código de máquina, reinício da Dart VM e reexecução do ponto de entrada do aplicativo. A Dart VM é uma máquina virtual que executa código Dart no modo JIT (Just-In-Time) durante o desenvolvimento e AOT (Ahead-Of-Time) em compilações de produção.
Durante o Hot Restart, o aplicativo passa por um ciclo de vida completo: chamada da função main, inicialização do WidgetsFlutterBinding, execução do runApp e construção de toda a árvore de widgets do zero. Todos os estados anteriores de widgets, variáveis e caches são limpos. Isso garante que o aplicativo esteja em um estado limpo, totalmente idêntico ao estado após uma nova instalação no dispositivo.
O processo pode ser representado como uma sequência de etapas: o desenvolvedor pressiona o botão Hot Restart na IDE, as ferramentas do Flutter enviam um comando para o dispositivo, o dispositivo salva o esqueleto do aplicativo atual, reinicia a Dart VM com o novo código e executa main novamente. Todas as dependências registradas no contêiner de injeção de dependências são recriadas do zero.
Uma característica principal é que o código binário da camada nativa (plugins, código Kotlin, código Swift) não é recompilado. O Hot Restart afeta apenas a camada Dart do aplicativo, o que garante a alta velocidade de reinicialização. Se as alterações afetarem o código nativo, é necessário um flutter build completo.
Flutter usa uma arquitetura onde o código Dart é executado na Dart VM e a interface do usuário é renderizada através do mecanismo Skia ou Impeller. Durante o Hot Restart, as ferramentas do Flutter reiniciam uma instância isolada da Dart VM (isolate), carregam arquivos .dill atualizados (Dart Intermediate Language) e reexecutam a função main. Toda a interface do usuário é reconstruída do zero através da chamada runApp, garantindo que todos os widgets estejam atualizados.
import 'package:flutter/material.dart';
void main() {
// Após o Hot Restart, esta função é executada novamente
var prefs = await SharedPreferences.getInstance();
var themeMode = prefs.getString('theme') ?? 'light';
runApp(MyApp(themeMode: themeMode));
}
Hot Restart e Hot Reload são dois mecanismos de desenvolvimento rápido que frequentemente são confundidos. Hot Reload carrega alterações no aplicativo em execução sem perder o estado atual, enquanto Hot Restart reinicia completamente o aplicativo. Hot Reload funciona mais rápido (0,1–1 segundo) mas não aplica alterações que afetem a inicialização ou campos estáticos de classe.
A principal diferença é o estado do aplicativo. Hot Reload preserva o estado atual dos widgets: posição de rolagem, dados inseridos, janelas modais abertas. Hot Restart redefine todo o estado para o inicial. Se a alteração afeta apenas o código no método build, Hot Reload é suficiente. Se a alteração afeta main, variáveis globais ou dependências, é necessário Hot Restart.
Hot Reload aplica alterações injetando código atualizado na Dart VM sem reiniciar o isolate. Isso só é possível para alterações que não quebrem a estrutura de tipos e não exijam reinicialização de widgets. Durante o Hot Restart, o isolate reinicia completamente, permitindo aplicar quaisquer alterações, incluindo exclusão ou renomeação de classes e métodos.
De acordo com a equipe Flutter, Hot Reload leva menos de 1 segundo para a maioria das alterações, enquanto Hot Restart leva de 1 a 3 segundos. Para aproximadamente 80% das alterações de interface do usuário, Hot Reload é suficiente. Hot Restart é necessário ao alterar configurações do aplicativo, variáveis globais, plugins nativos no wrapper Dart e decisões arquiteturais.
A seguinte estratégia é recomendada: use Hot Reload para edições visuais da UI e pequenas alterações de lógica; mude para Hot Restart ao alterar estruturas de dados, adicionar dependências ou editar código de inicialização. Isso minimiza o tempo de espera e mantém a produtividade de desenvolvimento alta.
O mecanismo de reinicialização a quente é implementado de forma diferente dependendo do framework e da linguagem de programação. Flutter fornece a implementação mais madura de Hot Restart através da compilação JIT da Dart VM, enquanto React Native usa um mecanismo similar através do Metro Bundler e JavaScript Core ou Hermes.
No Flutter, o Hot Restart é ativado pelo comando r no terminal após iniciar o aplicativo via flutter run. Alternativamente, use o botão Hot Restart no Android Studio, VS Code ou IntelliJ IDEA. Hot Restart funciona apenas no modo debug e não está disponível em compilações profile e release. Ao executar, as ferramentas do Flutter recompilam os arquivos alterados no formato kernel e os enviam para o dispositivo.
// Antes do Hot Restart: versão antiga
class Counter extends StatefulWidget {
final int initialValue = 0;
// Após o Hot Restart: o novo valor entrará em vigor
// final int initialValue = 10;
}
class CounterState extends State<Counter> {
int _count = 0;
// Hot Reload mantém _count, Hot Restart redefine para 0
}
Uma limitação do Hot Restart no Flutter é a incapacidade de preservar o estado de depuração. Após a reinicialização, todos os pontos de interrupção são preservados, mas os valores das variáveis no depurador são redefinidos. Para preservar o estado entre reinicializações, é usado o mecanismo State Restoration.
No React Native, a reinicialização a quente é implementada através do Metro Bundler, um agrupador de módulos JavaScript. Quando o código muda, o Metro reconstrói os módulos alterados e envia o bundle atualizado para o dispositivo. React Native suporta Fast Refresh, um análogo do Hot Reload que preserva o estado dos componentes funcionais usando hooks do React.
Uma reinicialização completa (Reload) no React Native recarrega o mecanismo JavaScript e todo o aplicativo como um todo. Isso é totalmente análogo ao Hot Restart no Flutter. Para ativá-lo, use Cmd+R no simulador iOS ou pressione R duas vezes no Android. O tempo de reinicialização completa no React Native varia de 2 a 8 segundos dependendo do tamanho do bundle.
Hot Restart é uma ferramenta indispensável em vários cenários de desenvolvimento. O primeiro e mais óbvio é alterar a configuração global do aplicativo: temas, localização, provedores de estado. Se você alterou um provedor na raiz da árvore de widgets ou adicionou um novo módulo ao contêiner DI, o Hot Restart garante a inicialização correta de todos os componentes.
O segundo cenário é alterar variáveis estáticas e constantes. Em Dart, campos estáticos são inicializados uma vez quando a classe é carregada. Hot Reload não aplica alterações em campos estáticos, portanto é necessário Hot Restart para atualizá-los. Isso é especialmente relevante ao trabalhar com constantes de configuração, URLs de API e flags de funcionalidades.
O terceiro cenário é depuração de inicialização: verificação do funcionamento da função main, tela de inicialização, carregamento de dependências. Com cada Hot Restart, o aplicativo passa por um ciclo de inicialização completo, permitindo identificar erros que ocorrem apenas na inicialização — problemas com SharedPreferences, erros de conexão com banco de dados, timeouts de inicialização.
O quarto cenário é testar o estado vazio. Hot Restart redefine todo o estado do aplicativo, permitindo verificar o comportamento no primeiro lançamento: exibição de tutorial, solicitação de permissões, listas vazias e telas de placeholder. Para testes repetíveis, isso é significativamente mais rápido que reinstalar o aplicativo.
Perguntas frequentes
Hot Restart reinicia completamente o aplicativo e a Dart VM, redefinindo o estado para o inicial. Hot Reload injeta alterações no aplicativo em execução, preservando o estado atual da UI. Hot Reload é mais rápido mas não pode ser usado para alterações de inicialização e variáveis globais.
No terminal após iniciar flutter run, pressione a tecla R (Shift+R) para Hot Restart. No Android Studio ou VS Code, use o botão Hot Restart no painel de depuração. O comando está disponível apenas no modo debug.
Um Hot Restart típico leva de 1 a 3 segundos para projetos de tamanho médio. O tempo depende do número de arquivos Dart, da complexidade da árvore de widgets e do desempenho do dispositivo. Para projetos grandes, o tempo pode chegar a 5–8 segundos.
Não, Hot Restart está disponível apenas no modo debug. Compilações release e profile usam compilação AOT, que não suporta recarga a quente. Para atualizar código em release, é necessária uma reconstrução completa.
Hot Restart não afeta o código nativo — plugins Kotlin, Swift ou Java. Se alterações forem feitas no código nativo do plugin, é necessária uma reconstrução completa do projeto. Hot Restart é eficaz apenas para a camada Dart do aplicativo.
Resumo
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.
Leia também