Hot Restart est un mécanisme de rechargement rapide d’une application mobile pendant le développement, dans lequel l’application redémarre complètement avec le code source mis à jour. Contrairement à une recompilation complète, Hot Restart utilise du code binaire déjà compilé et ne recharge que la Dart VM, réduisant ainsi le temps du cycle de développement. Selon la documentation Flutter (2025), un Hot Restart typique prend de 1 à 3 secondes. Hot Restart est particulièrement utile lors de la modification de l’état global de l’application et du code d’initialisation.
Points clés
Hot Restart est un mécanisme de développement dans lequel l’application est complètement rechargée avec le code source mis à jour sans nécessiter une recompilation complète du projet. Le développeur apporte des modifications au code, enregistre le fichier et envoie une commande de redémarrage via l’IDE. L’application recompile les fichiers modifiés, redémarre la Dart VM et parcourt tout le cycle de vie de main jusqu’au rendu final de l’interface utilisateur.
Hot Restart diffère d’une reconstruction complète en utilisant des bibliothèques binaires déjà compilées et le framework Flutter sans recompiler les wrappers natifs. Cela réduit le temps du cycle de développement de plusieurs minutes à plusieurs secondes. Selon une enquête auprès des développeurs Flutter (2024), le temps moyen de Hot Restart est de 2,1 secondes, soit environ 97% plus rapide qu’une reconstruction complète du projet via la commande flutter build.
Le mécanisme est particulièrement demandé lors du développement d’interfaces utilisateur nécessitant une vérification fréquente des modifications visuelles. Le développeur peut modifier la couleur, la taille ou la position d’un élément et voir instantanément le résultat sur un simulateur ou un périphérique physique sans perdre le contexte de développement à cause d’une compilation longue. Cela accélère radicalement le prototypage itératif.
Lors de l’exécution d’une commande Hot Restart, une séquence d’opérations se produit : enregistrement des fichiers modifiés, compilation incrémentale des fichiers Dart modifiés en code machine, redémarrage de la Dart VM et réexécution du point d’entrée de l’application. La Dart VM est une machine virtuelle qui exécute le code Dart en mode JIT (Just-In-Time) pendant le développement et AOT (Ahead-Of-Time) dans les builds de production.
Pendant Hot Restart, l’application traverse un cycle de vie complet : appel de la fonction main, initialisation de WidgetsFlutterBinding, lancement de runApp et construction de tout l’arbre de widgets depuis zéro. Tous les états précédents des widgets, variables et caches sont effacés. Cela garantit que l’application est dans un état propre, totalement identique à l’état après une nouvelle installation sur l’appareil.
Le processus peut être représenté comme une séquence d’étapes : le développeur appuie sur le bouton Hot Restart dans l’IDE, les outils Flutter envoient une commande à l’appareil, l’appareil enregistre le squelette de l’application actuel, redémarre la Dart VM avec le nouveau code et relance main. Toutes les dépendances enregistrées dans le conteneur d’injection de dépendances sont recréées depuis zéro.
Une caractéristique clé est que le code binaire de la couche native (plugins, code Kotlin, code Swift) n’est pas recompilé. Hot Restart n’affecte que la couche Dart de l’application, ce qui garantit la vitesse élevée du redémarrage. Si les modifications affectent le code natif, un flutter build complet est nécessaire.
Flutter utilise une architecture où le code Dart est exécuté sur la Dart VM et l’interface utilisateur est rendue via le moteur Skia ou Impeller. Pendant Hot Restart, les outils Flutter redémarrent une instance isolée de la Dart VM (isolate), chargent les fichiers .dill mis à jour (Dart Intermediate Language) et réexécutent la fonction main. L’ensemble de l’interface utilisateur est reconstruit depuis zéro via l’appel runApp, garantissant que tous les widgets sont à jour.
import 'package:flutter/material.dart';
void main() {
// Après Hot Restart, cette fonction est exécutée à nouveau
var prefs = await SharedPreferences.getInstance();
var themeMode = prefs.getString('theme') ?? 'light';
runApp(MyApp(themeMode: themeMode));
}
Hot Restart et Hot Reload sont deux mécanismes de développement rapide souvent confondus. Hot Reload charge les modifications dans l’application en cours d’exécution sans perdre l’état actuel, tandis que Hot Restart redémarre complètement l’application. Hot Reload fonctionne plus rapidement (0,1–1 seconde) mais n’applique pas les modifications affectant l’initialisation ou les champs statiques de classe.
La principale différence est l’état de l’application. Hot Reload préserve l’état actuel des widgets : position de défilement, données saisies, fenêtres modales ouvertes. Hot Restart réinitialise tout l’état. Si la modification n’affecte que le code dans la méthode build, Hot Reload est suffisant. Si la modification affecte main, les variables globales ou les dépendances, Hot Restart est nécessaire.
Hot Reload applique les modifications en injectant du code mis à jour dans la Dart VM sans redémarrer l’isolate. Ceci n’est possible que pour les modifications qui ne cassent pas la structure des types et ne nécessitent pas de réinitialisation des widgets. Pendant Hot Restart, l’isolate redémarre complètement, permettant d’appliquer toutes les modifications, y compris la suppression ou le renommage de classes et de méthodes.
Selon l’équipe Flutter, Hot Reload prend moins d’une seconde pour la plupart des modifications, tandis que Hot Restart prend de 1 à 3 secondes. Pour environ 80% des modifications d’interface utilisateur, Hot Reload est suffisant. Hot Restart est nécessaire lors de la modification des configurations de l’application, des variables globales, des plugins natifs dans le wrapper Dart et des décisions architecturales.
La stratégie suivante est recommandée : utilisez Hot Reload pour les modifications visuelles de l’UI et les petites modifications de logique ; passez à Hot Restart lors de la modification des structures de données, de l’ajout de dépendances ou de l’édition du code d’initialisation. Cela minimise le temps d’attente et maintient une productivité de développement élevée.
Le mécanisme de redémarrage à chaud est implémenté différemment selon le framework et le langage de programmation. Flutter fournit l’implémentation la plus mature de Hot Restart via la compilation JIT de la Dart VM, tandis que React Native utilise un mécanisme similaire via Metro Bundler et JavaScript Core ou Hermes.
Dans Flutter, Hot Restart est activé par la commande r dans le terminal après le démarrage de l’application via flutter run. Alternativement, utilisez le bouton Hot Restart dans Android Studio, VS Code ou IntelliJ IDEA. Hot Restart fonctionne uniquement en mode debug et n’est pas disponible dans les builds profile et release. Lors de l’exécution, les outils Flutter recompilent les fichiers modifiés au format kernel et les envoient à l’appareil.
// Avant Hot Restart : ancienne version
class Counter extends StatefulWidget {
final int initialValue = 0;
// Après Hot Restart : la nouvelle valeur entrera en vigueur
// final int initialValue = 10;
}
class CounterState extends State<Counter> {
int _count = 0;
// Hot Reload conserve _count, Hot Restart le réinitialise à 0
}
Une limitation de Hot Restart dans Flutter est l’incapacité de préserver l’état de débogage. Après le redémarrage, tous les points d’arrêt sont conservés, mais les valeurs des variables dans le débogueur sont réinitialisées. Pour préserver l’état entre les redémarrages, le mécanisme State Restoration est utilisé.
Dans React Native, le redémarrage à chaud est implémenté via Metro Bundler, un regroupeur de modules JavaScript. Lorsque le code change, Metro reconstruit les modules modifiés et envoie le bundle mis à jour à l’appareil. React Native prend en charge Fast Refresh, un analogue de Hot Reload qui préserve l’état des composants fonctionnels à l’aide des hooks React.
Un redémarrage complet (Reload) dans React Native recharge le moteur JavaScript et l’application entière. Cela est totalement analogue à Hot Restart dans Flutter. Pour l’activer, utilisez Cmd+R sur le simulateur iOS ou appuyez deux fois sur R sous Android. Le temps de redémarrage complet dans React Native varie de 2 à 8 secondes selon la taille du bundle.
Hot Restart est un outil indispensable dans plusieurs scénarios de développement. Le premier et le plus évident est la modification de la configuration globale de l’application : thèmes, localisation, fournisseurs d’état. Si vous avez modifié un fournisseur à la racine de l’arbre de widgets ou ajouté un nouveau module au conteneur DI, Hot Restart garantit une initialisation correcte de tous les composants.
Le deuxième scénario est la modification des variables statiques et des constantes. En Dart, les champs statiques sont initialisés une fois lors du chargement de la classe. Hot Reload n’applique pas les modifications aux champs statiques, donc Hot Restart est nécessaire pour les mettre à jour. Ceci est particulièrement pertinent lors du travail avec des constantes de configuration, des URL d’API et des indicateurs de fonctionnalités.
Le troisième scénario est le débogage de l’initialisation : vérification du fonctionnement de la fonction main, de l’écran de démarrage, du chargement des dépendances. À chaque Hot Restart, l’application traverse un cycle d’initialisation complet, permettant d’identifier les erreurs qui ne surviennent qu’au démarrage — problèmes avec SharedPreferences, erreurs de connexion à la base de données, délais d’initialisation.
Le quatrième scénario est le test de l’état vide. Hot Restart réinitialise tout l’état de l’application, permettant de vérifier le comportement au premier lancement : affichage de l’intégration, demande d’autorisations, listes vides et écrans de substitution. Pour les tests répétables, c„st nettement plus rapide que de réinstaller l’application.
Foire aux questions
Hot Restart redémarre complètement l’application et la Dart VM, réinitialisant l’état. Hot Reload injecte les modifications dans l’application en cours d’exécution, préservant l’état actuel de l’UI. Hot Reload est plus rapide mais ne peut pas être utilisé pour les modifications d’initialisation et les variables globales.
Dans le terminal après le lancement de flutter run, appuyez sur la touche R (Shift+R) pour Hot Restart. Dans Android Studio ou VS Code, utilisez le bouton Hot Restart dans le panneau de débogage. La commande est disponible uniquement en mode debug.
Un Hot Restart typique prend de 1 à 3 secondes pour des projets de taille moyenne. Le temps dépend du nombre de fichiers Dart, de la complexité de l’arbre de widgets et des performances de l’appareil. Pour les grands projets, le temps peut atteindre 5–8 secondes.
Non, Hot Restart est disponible uniquement en mode debug. Les builds release et profile utilisent la compilation AOT, qui ne prend pas en charge le rechargement à chaud. Pour mettre à jour le code en release, une reconstruction complète est nécessaire.
Hot Restart n’affecte pas le code natif — plugins Kotlin, Swift ou Java. Si des modifications sont apportées au code natif du plugin, une reconstruction complète du projet est nécessaire. Hot Restart n’est efficace que pour la couche Dart de l’application.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi