Hot Restart nello sviluppo mobile — essenza, meccanismo e principio di funzionamento

Autore: IT Sectr Pubblicato: 2026-05-18 Tempo di lettura: 8 min

Hot Restart è un meccanismo di ricarica rapida di un’applicazione mobile durante lo sviluppo, in cui l’applicazione viene completamente riavviata con il codice sorgente aggiornato. A differenza di una ricompilazione completa, Hot Restart utilizza codice binario già compilato e ricarica solo la Dart VM, riducendo il tempo del ciclo di sviluppo. Secondo la documentazione Flutter (2025), un Hot Restart tipico richiede da 1 a 3 secondi. Hot Restart è particolarmente utile quando si modifica lo stato globale dell’applicazione e il codice di inizializzazione.

Punti chiave

  • Hot Restart — un riavvio completo dell’applicazione con codice aggiornato, in cui la Dart VM viene ricaricata e lo stato dell’applicazione viene resettato allo stato iniziale.
  • Hot Reload — caricamento incrementale delle modifiche senza perdere lo stato corrente dell’applicazione, funziona significativamente più velocemente di Hot Restart.
  • Dart VM viene completamente riavviata durante Hot Restart, garantendo l’applicazione di tutte le modifiche, inclusa l’inizializzazione e le variabili statiche.
  • Principio di funzionamento include la ricompilazione dei file modificati, il riavvio della Dart VM e la reinizializzazione dell’applicazione in 1–3 secondi.
  • Scenari di utilizzo — modifiche a variabili globali, configurazioni, contenitori DI e codice di inizializzazione che richiedono un reset completo dello stato.

Cos’è Hot Restart?

Hot Restart è un meccanismo di sviluppo in cui l’applicazione viene completamente ricaricata con il codice sorgente aggiornato senza la necessità di una ricompilazione completa del progetto. Lo sviluppatore apporta modifiche al codice, salva il file e invia un comando di riavvio tramite l’IDE. L’applicazione ricompila i file modificati, riavvia la Dart VM e percorre l’intero ciclo di vita da main fino al rendering finale dell’interfaccia utente.

Hot Restart si differenzia da una ricostruzione completa perché utilizza librerie binarie già compilate e il framework Flutter senza ricompilare i wrapper nativi. Questo riduce il tempo del ciclo di sviluppo da diversi minuti a pochi secondi. Secondo un sondaggio tra sviluppatori Flutter (2024), il tempo medio di Hot Restart è di 2,1 secondi, circa il 97% più veloce di una ricostruzione completa del progetto tramite il comando flutter build.

Il meccanismo è particolarmente richiesto nello sviluppo di interfacce utente che richiedono una frequente verifica di modifiche visive. Lo sviluppatore può modificare il colore, le dimensioni o la posizione di un elemento e vedere immediatamente il risultato su un simulatore o un dispositivo fisico senza perdere il contesto di sviluppo a causa di una lunga compilazione. Questo accelera radicalmente la prototipazione iterativa.

Come funziona il meccanismo Hot Restart?

Quando si esegue un comando Hot Restart, si verifica una sequenza di operazioni: salvataggio dei file modificati, compilazione incrementale dei file Dart modificati in codice macchina, riavvio della Dart VM e riesecuzione del punto di ingresso dell’applicazione. La Dart VM è una macchina virtuale che esegue codice Dart in modalità JIT (Just-In-Time) durante lo sviluppo e AOT (Ahead-Of-Time) nei build di produzione.

Ciclo di vita durante Hot Restart

Durante Hot Restart, l’applicazione attraversa un ciclo di vita completo: chiamata della funzione main, inizializzazione di WidgetsFlutterBinding, esecuzione di runApp e costruzione dell’intero albero dei widget da zero. Tutti gli stati precedenti dei widget, le variabili e le cache vengono cancellati. Questo garantisce che l’applicazione si trovi in uno stato pulito, completamente identico allo stato dopo una nuova installazione sul dispositivo.

Il processo può essere rappresentato come una sequenza di passaggi: lo sviluppatore preme il pulsante Hot Restart nell’IDE, gli strumenti Flutter inviano un comando al dispositivo, il dispositivo salva lo scheletro dell’applicazione corrente, riavvia la Dart VM con il nuovo codice e riesegue main. Tutte le dipendenze registrate nel contenitore di dependency injection vengono ricreate da zero.

Una caratteristica fondamentale è che il codice binario del layer nativo (plugin, codice Kotlin, codice Swift) non viene ricompilato. Hot Restart interessa solo il layer Dart dell’applicazione, garantendo così l’elevata velocità di riavvio. Se le modifiche interessano il codice nativo, è necessario un flutter build completo.

Implementazione tecnica in Flutter

Flutter utilizza un’architettura in cui il codice Dart viene eseguito sulla Dart VM e l’interfaccia utente viene renderizzata tramite il motore Skia o Impeller. Durante Hot Restart, gli strumenti Flutter riavviano un’istanza isolata della Dart VM (isolate), caricano i file .dill aggiornati (Dart Intermediate Language) e rieseguono la funzione main. L’intera interfaccia utente viene ricostruita da zero tramite la chiamata runApp, garantendo che tutti i widget siano aggiornati.

dart
import 'package:flutter/material.dart';

void main() {
  // Dopo Hot Restart, questa funzione viene eseguita di nuovo
  var prefs = await SharedPreferences.getInstance();
  var themeMode = prefs.getString('theme') ?? 'light';
  runApp(MyApp(themeMode: themeMode));
}

Hot Restart vs Hot Reload: differenze principali

Hot Restart e Hot Reload sono due meccanismi di sviluppo rapido che vengono spesso confusi. Hot Reload carica le modifiche nell’applicazione in esecuzione senza perdere lo stato corrente, mentre Hot Restart riavvia completamente l’applicazione. Hot Reload funziona più velocemente (0,1–1 secondo) ma non applica modifiche che interessano l’inizializzazione o i campi statici di classe.

Preservazione dello stato dell’applicazione

La differenza principale è lo stato dell’applicazione. Hot Reload preserva lo stato corrente dei widget: posizione di scorrimento, dati inseriti, finestre modali aperte. Hot Restart resetta tutto lo stato allo stato iniziale. Se la modifica interessa solo il codice nel metodo build, Hot Reload è sufficiente. Se la modifica interessa main, variabili globali o dipendenze, è necessario Hot Restart.

Hot Reload applica le modifiche iniettando codice aggiornato nella Dart VM senza riavviare l’isolate. Questo è possibile solo per modifiche che non rompono la struttura dei tipi e non richiedono la reinizializzazione dei widget. Durante Hot Restart, l’isolate viene completamente riavviato, consentendo di applicare qualsiasi modifica, inclusa l’eliminazione o la ridenominazione di classi e metodi.

Prestazioni e scenari

Secondo il team Flutter, Hot Reload richiede meno di 1 secondo per la maggior parte delle modifiche, mentre Hot Restart richiede da 1 a 3 secondi. Per circa l’80% delle modifiche all’interfaccia utente, Hot Reload è sufficiente. Hot Restart è necessario quando si modificano configurazioni dell’applicazione, variabili globali, plugin nativi nel wrapper Dart e decisioni architetturali.

Si consiglia la seguente strategia: utilizzare Hot Reload per modifiche visive dell’UI e piccole modifiche alla logica; passare a Hot Restart quando si modificano strutture dati, si aggiungono dipendenze o si modifica il codice di inizializzazione. Ciò riduce al minimo i tempi di attesa e mantiene elevata la produttività dello sviluppo.

Implementazione di Hot Restart nei framework popolari

Il meccanismo di riavvio a caldo viene implementato in modo diverso a seconda del framework e del linguaggio di programmazione. Flutter fornisce l’implementazione più matura di Hot Restart attraverso la compilazione JIT della Dart VM, mentre React Native utilizza un meccanismo simile tramite Metro Bundler e JavaScript Core o Hermes.

Hot Restart in Flutter

In Flutter, Hot Restart viene attivato dal comando r nel terminale dopo aver avviato l’applicazione tramite flutter run. In alternativa, utilizzare il pulsante Hot Restart in Android Studio, VS Code o IntelliJ IDEA. Hot Restart funziona solo in modalità debug e non è disponibile nei build profile e release. Durante l’esecuzione, gli strumenti Flutter ricompilano i file modificati in formato kernel e li inviano al dispositivo.

dart
// Prima di Hot Restart: versione vecchia
class Counter extends StatefulWidget {
  final int initialValue = 0;
  // Dopo Hot Restart: il nuovo valore entrerà in vigore
  // final int initialValue = 10;
}

class CounterState extends State<Counter> {
  int _count = 0;
  // Hot Reload mantiene _count, Hot Restart lo resetta a 0
}

Una limitazione di Hot Restart in Flutter è l’incapacità di preservare lo stato di debug. Dopo il riavvio, tutti i punti di interruzione vengono conservati, ma i valori delle variabili nel debugger vengono resettati. Per preservare lo stato tra i riavvii, viene utilizzato il meccanismo State Restoration.

Hot Restart in React Native

In React Native, il riavvio a caldo viene implementato tramite Metro Bundler, un raggruppatore di moduli JavaScript. Quando il codice cambia, Metro ricostruisce i moduli modificati e invia il bundle aggiornato al dispositivo. React Native supporta Fast Refresh, un analogo di Hot Reload che preserva lo stato dei componenti funzionali utilizzando gli hook di React.

Un riavvio completo (Reload) in React Native ricarica il motore JavaScript e l’intera applicazione. Ciò è completamente analogo a Hot Restart in Flutter. Per attivarlo, utilizzare Cmd+R sul simulatore iOS o premere R due volte su Android. Il tempo di riavvio completo in React Native varia da 2 a 8 secondi a seconda delle dimensioni del bundle.

Quando usare Hot Restart nello sviluppo

Hot Restart è uno strumento indispensabile in diversi scenari di sviluppo. Il primo e più ovvio è la modifica della configurazione globale dell’applicazione: temi, localizzazione, provider di stato. Se si modifica un provider alla radice dell’albero dei widget o si aggiunge un nuovo modulo al contenitore DI, Hot Restart garantisce la corretta inizializzazione di tutti i componenti.

Il secondo scenario è la modifica di variabili statiche e costanti. In Dart, i campi statici vengono inizializzati una volta quando la classe viene caricata. Hot Reload non applica modifiche ai campi statici, quindi è necessario Hot Restart per aggiornarli. Ciò è particolarmente rilevante quando si lavora con costanti di configurazione, URL API e flag di funzionalità.

Il terzo scenario è il debug dell’inizializzazione: verifica del funzionamento della funzione main, della schermata di avvio, del caricamento delle dipendenze. Con ogni Hot Restart, l’applicazione attraversa un ciclo di inizializzazione completo, consentendo di identificare gli errori che si verificano solo all’avvio — problemi con SharedPreferences, errori di connessione al database, timeout di inizializzazione.

Il quarto scenario è il test dello stato vuoto. Hot Restart resetta tutto lo stato dell’applicazione, consentendo di verificare il comportamento al primo avvio: visualizzazione dell’onboarding, richiesta di autorizzazioni, elenchi vuoti e schermate placeholder. Per test ripetibili, questo è significativamente più veloce che reinstallare l’applicazione.

Domande frequenti

In cosa Hot Restart differisce da Hot Reload?

Hot Restart riavvia completamente l’applicazione e la Dart VM, resettando lo stato allo stato iniziale. Hot Reload inietta le modifiche nell’applicazione in esecuzione, preservando lo stato corrente dell’UI. Hot Reload è più veloce ma non può essere utilizzato per modifiche all’inizializzazione e variabili globali.

Come eseguire Hot Restart in Flutter?

Nel terminale dopo l’avvio di flutter run, premere il tasto R (Shift+R) per Hot Restart. In Android Studio o VS Code, utilizzare il pulsante Hot Restart nel pannello di debug. Il comando è disponibile solo in modalità debug.

Quanto tempo richiede Hot Restart?

Un Hot Restart tipico richiede da 1 a 3 secondi per progetti di medie dimensioni. Il tempo dipende dal numero di file Dart, dalla complessità dell’albero dei widget e dalle prestazioni del dispositivo. Per progetti grandi, il tempo può arrivare a 5–8 secondi.

Hot Restart funziona in build release?

No, Hot Restart è disponibile solo in modalità debug. I build release e profile utilizzano la compilazione AOT, che non supporta il ricaricamento a caldo. Per aggiornare il codice in release, è necessaria una ricostruzione completa.

Si può utilizzare Hot Restart con plugin nativi?

Hot Restart non influisce sul codice nativo — plugin Kotlin, Swift o Java. Se vengono apportate modifiche al codice nativo del plugin, è necessaria una ricostruzione completa del progetto. Hot Restart è efficace solo per il layer Dart dell’applicazione.

Riepilogo

  • Hot Restart — un meccanismo per riavviare completamente l’applicazione con codice Dart aggiornato, resettando lo stato allo stato iniziale.
  • Differenza da Hot Reload — riavvio completo della Dart VM e reinizializzazione di tutti i componenti, incluse variabili globali e campi statici.
  • Tempo di esecuzione — 1–3 secondi per un progetto tipico, 97% più veloce di una ricostruzione completa tramite flutter build.
  • Scenari di utilizzo — modifica della configurazione globale, variabili statiche, contenitori DI e codice di inizializzazione.
  • Limitazioni — non si applica al codice nativo (Kotlin/Swift), disponibile solo in modalità debug, resetta lo stato di debug.
  • Strategia di utilizzo — Hot Reload per modifiche UI, Hot Restart per modifiche all’architettura e all’inizializzazione, ricostruzione completa per codice nativo.
  • Implementazione — Flutter utilizza la compilazione JIT della Dart VM, React Native utilizza Metro Bundler con ricarica del motore JS.

Svilupperemo un'applicazione mobile chiavi in mano

IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.

Discuti il progetto

Leggi anche