Hot Reload — une technologie qui permet de mettre à jour le code d'une application mobile en cours d'exécution sans redémarrage ni perte de l'état actuel. Le développeur modifie le code source — en une seconde les modifications apparaissent à l'écran du périphérique ou de l'émulateur. C'est une fonctionnalité clé de Flutter et React Native, accélérant radicalement les itérations de développement : le temps du cycle édition-visualisation est réduit de 5 à 10 secondes (reconstruction) à 300–500 millisecondes. Selon Flutter Documentation, 2025, le hot reload effectue une compilation incrémentale du code modifié et envoie la mise à jour à Dart VM.
Points essentiels
Hot Reload est un mécanisme de développement où le code source est modifié et appliqué à une application déjà en cours d'exécution sans l'arrêter. Le développeur édite un fichier, le sauvegarde, et en 0,3 à 2 secondes l'interface mise à jour apparaît à l'écran. L'état de l'application (compteurs, position de défilement, données saisies) est préservé — le développeur ne perd pas le contexte.
Le concept de hot reload est né dans les premiers outils web (LiveReload, 2010) et a été adapté pour le développement mobile par Flutter (2017) et React Native (2015). Aujourd'hui, le hot reload est une fonctionnalité obligatoire des frameworks mobiles modernes, au même titre que la configuration de débogage et le profilage. Sans hot reload, le développement d'UI est considéré comme inefficace : chaque révision de modification nécessite 10 à 30 secondes pour la reconstruction et le lancement.
Techniquement, le hot reload comprend trois étapes : détection de modification (file watcher), compilation du code modifié (compilateur incrémental) et application (hot patching). Chaque framework implémente ces étapes différemment, mais le résultat est le même : un délai minimal entre l'édition et l'affichage.
Hot Reload dans Flutter repose sur l'architecture Dart VM et la compilation JIT. Lorsque le développeur appuie sur « Hot Reload » dans l'IDE ou sauvegarde un fichier, Flutter effectue une compilation incrémentale des bibliothèques Dart modifiées en fichiers kernel (.dill). La Dart VM charge ces fichiers et remplace les implémentations des fonctions modifiées dans l'application en cours d'exécution.
// Widget avec état Flutter préservé pendant le hot reload
class CounterWidget extends StatefulWidget {
@override
State createState() => _CounterState();
}
class _CounterState extends State {
int _counter = 0;
@override
Widget build(BuildContext context) {
return Column(
children: [
Text('Compteur : $_counter'),
ElevatedButton(
onPressed: () => setState(() => _counter++),
child: Text('Incrémenter'),
),
],
);
}
}
Dans l'exemple, le StatefulWidget CounterWidget préserve le champ _counter pendant le hot reload. La Dart VM recrée l'état (State) en appelant reassemble(), mais ne réinitialise pas _counter — la valeur est préservée sauf si le widget est complètement recréé. Flutter appelle reassemble() pour tous les objets State, et build() s'exécute à nouveau avec le code mis à jour et l'état préservé.
Quand le hot reload ne fonctionne pas : si une variable d'initialisation statique (static const), une variable globale, main(), une déclaration de classe enum/mixin ou du code dans @override initState() a été modifié. Dans ces cas, un Hot Restart est nécessaire. Selon Flutter Team (2025), le hot reload réussit dans 85 à 90 % des cas ; 10 à 15 % des modifications nécessitent un redémarrage complet.
Dart VM en mode débogage fonctionne comme un compilateur JIT : elle interprète le code Dart via le format kernel (analogue au bytecode). Le hot reload charge un nouveau fichier kernel et remplace les anciennes définitions de fonctions. La VM ne redémarre pas les isolates — toutes les opérations asynchrones (Future, Stream) continuent de s'exécuter. En mode release, Dart est compilé en AOT (dart2native) et le hot reload n'est pas disponible.
Fast Refresh (anciennement Hot Reloading) dans React Native utilise Metro bundler — un regroupeur de modules JavaScript qui surveille les modifications de fichiers. Lorsque le développeur sauvegarde un fichier, Metro compile uniquement le module modifié (HMR — Hot Module Replacement) et envoie la mise à jour via WebSocket à l'application en cours d'exécution.
// Composant React Native avec préservation d'état pendant le hot reload
import React, { useState } from 'react';
import { View, Text, Button } from 'react-native';
const Counter = () => {
const [count, setCount] = useState(0);
return (
<View>
<Text>Compteur : {count}Text>
<Button title="Incrémenter"
onPress={() => setCount(c => c + 1)} />
View>
);
};
Fast Refresh préserve l'état React (useState, useReducer) lors de la mise à jour du module. Metro HMR transmet uniquement le diff du module modifié — pas l'intégralité du bundle. React Native utilise React Fast Refresh, développé par l'équipe React (Dan Abramov, 2019) : il génère un nouveau render pour le composant mais préserve les états des hooks et les props si la signature du composant n'a pas changé.
Fast Refresh ne fonctionne pas lors de la modification : de l'exportation du composant, des hooks (useEffect, useMemo), des dépendances de modules et des modules natifs (Java/Objective-C). Ces modifications nécessitent un Reload (rechargement complet du bundle JS) ou un Rebuild (reconstruction du code natif). Le temps de fast refresh est de 200 à 800 ms, le reload complet est de 2 à 5 secondes.
Hot Reload et Hot Restart sont deux modes de mise à jour de code avec des scénarios d'utilisation différents. Hot Reload convient aux modifications d'UI (styles, mise en page, couleurs, textes), lorsque la structure des classes et le type d'état ne changent pas. Hot Restart est nécessaire lors de la modification des signatures de méthodes, de l'ajout de nouveaux widgets/composants à l'arborescence racine, de la modification d'initState et des modules natifs.
| Caractéristique | Hot Reload | Hot Restart |
|---|---|---|
| Vitesse | 0,3 à 2 secondes | 2 à 10 secondes |
| Préservation de l'état | Oui (variables, state, pile de navigation) | Non (l'application redémarre à zéro) |
| Compilation | Incrémentale (modifications uniquement) | Recompilation complète Dart/JS |
| Quand utiliser | Ajustements UI, styles, textes, mise en page | Modifications structurelles, nouveaux modules, code natif |
| Flutter | Hot Reload (R) | Hot Restart (Shift + R) |
| React Native | Fast Refresh | Reload (Cmd + R) |
Stratégie recommandée : commencer par hot reload. Si les modifications ne sont pas appliquées (l'IDE affiche « Reload needed ») — effectuer un hot restart. Dans Flutter, l'icône du bouton change : éclair (⚡) pour hot reload, éclair barré si un restart est nécessaire. L'efficacité du développement avec hot reload est 40 à 60 % supérieure par rapport aux reconstructions complètes (données JetBrains Developer Survey 2024).
Injection de code (code injection) est le mécanisme général de hot reload utilisé par tous les frameworks. Il comprend trois phases. Première — détection de modification : un file watcher (intégré à l'IDE) ou le système de fichiers (FSNotify) détecte une modification dans un fichier .dart, .js, .tsx. Deuxième — compilation : le compilateur incrémental transforme uniquement le fichier modifié en une représentation intermédiaire (kernel .dill pour Dart, module HMR pour JS). Troisième — application : le nouveau code est envoyé au dispositif et remplace les anciennes définitions dans la mémoire de l'application en cours d'exécution.
Remplacement à chaud de fonctions (hot patching) est une technique où l'exécutable remplace le pointeur de fonction dans la table des méthodes virtuelles. Dart VM utilise ClassTable — une structure interne contenant toutes les classes chargées. Pendant le hot reload, la VM trouve la classe dans ClassTable et remplace ses définitions de fonctions par les nouvelles provenant du fichier kernel. Toutes les instances existantes de la classe obtiennent automatiquement le nouveau comportement.
// Flutter : callback reassemble pour gérer l'état après hot reload
class MyWidget extends StatefulWidget {
@override
State createState() => _MyState();
}
mixin ReloadAware on State {
@override
void reassemble() {
super.reassemble();
// Réinitialiser le cache ou les données après hot reload
clearCache();
}
}
Dans l'exemple, le mixin ReloadAware redéfinit la méthode reassemble(), que Dart VM appelle sur chaque objet State après un hot reload. Le développeur peut réinitialiser le cache, réinitialiser les ressources ou effectuer une migration d'état. Sans cette méthode, les anciennes données peuvent rester dans le cache et provoquer des incohérences après la mise à jour des widgets.
Le remplacement à chaud ne fonctionne pas pour les modifications nécessitant une réallocation mémoire pour de nouveaux champs, un changement de type de variable dans une classe, l'ajout de nouveaux champs dans StatefulWidget, la modification de valeurs d'enum ou de paramètres génériques. Ces modifications sont incompatibles avec les objets existants en mémoire — Dart VM ne peut pas « mélanger » les champs dans des objets déjà alloués. Pour de tels cas, un hot restart ou une reconstruction complète est nécessaire.
Le développement natif Android et iOS n'a traditionnellement pas de hot reload complet. Android Studio avec Android 11+ et AGP 4.2+ prend en charge Apply Changes : mise à jour du code sans redémarrage de l'application. Apply Changes fonctionne via Android Runtime (ART) — il remplace les implémentations de méthodes dans les fichiers dex à la volée. Cependant, Apply Changes est limité : il ne fonctionne pas pour les modifications de ressources (layout.xml, drawable), de manifeste et de bibliothèques natives.
Apple a introduit Previews (SwiftUI Preview) dans Xcode 15 (2023) — ce n'est pas un hot reload au sens classique. Previews compile la section d'aperçu séparément de l'application principale et affiche le résultat dans le canvas de Xcode. Lors de la sauvegarde d'un fichier, l'aperçu se met à jour en 1 à 3 secondes, mais l'état de l'application n'est pas préservé. Pour les projets UIKit, le hot reload est disponible via des outils tiers : InjectionIII (John Holdsworth) et SwiftHotReload.
Kotlin Multiplatform (KMP) a reçu un support expérimental de hot reload de JetBrains à partir de 2024. Le mécanisme est basé sur Kotlin/Native runtime avec remplacement de fonctions dans le fichier objet (.klib). JetBrains Compose Multiplayer utilise sa propre implémentation de hot reload, similaire à Flutter : compilation incrémentale et remplacement de classes dans Kotlin/Native runtime. Vitesse — 1 à 3 secondes, disponible uniquement pour les modifications d'UI.
Apply Changes est un mécanisme d'Android Studio qui utilise l'API ART runtime. Lors de la sauvegarde du code, Android Studio détermine quelles classes ont été modifiées et envoie leurs fichiers dex au dispositif via adb. ART remplace les implémentations de méthodes dans l'application en cours d'exécution sans l'arrêter. Apply Changes fonctionne en trois modes : Instant Run (remplacement rapide de méthode), Swap (remplacement de classe avec recréation d'instances) et Restart Activity (si les modifications sont incompatibles avec l'état actuel).
Foire aux questions
Hot Reload met à jour le code sans redémarrer l'application et préserve l'état. Live Reload recharge l'intégralité de l'application ou de la page web lors de la modification des fichiers. Live Reload est plus simple à implémenter, mais plus lent et perd l'état. Flutter et React Native utilisent le hot reload ; les outils web utilisent le live reload.
Hot Reload ne fonctionne pas pour les modifications nécessitant une réallocation mémoire (nouveaux champs de classe), la modification de constantes statiques (static const), le renommage de widgets, la modification d'enum ou de paramètres génériques. Ces modifications sont incompatibles avec les objets existants dans la mémoire de Dart VM ou de JavaScript runtime.
Oui, le hot reload fonctionne à la fois sur les appareils physiques et les émulateurs. Flutter envoie les fichiers kernel à l'appareil via USB (adb forward) ou Wi-Fi. React Native utilise WebSocket via Metro bundler. Le délai sur un appareil physique est généralement 10 à 30 % plus élevé que sur un émulateur.
Xcode Previews (depuis 2021) est un analogue du hot reload pour SwiftUI, mais avec des limitations : les aperçus sont compilés séparément, ne prennent pas en charge la navigation dans l'application et les états complexes. Apple ne fournit pas de hot reload officiel pour iOS. Outils tiers : InjectionIII et SwiftHotReload utilisent Objective-C Runtime pour l'injection de code.
Si l'UI s'affiche incorrectement après un hot reload : effectuer un hot restart. Si le problème vient des données — vérifier le callback reassemble() dans Flutter ou le cleanup useEffect dans React Native. Pour les problèmes persistants, utiliser Flutter Clean ou Reset Metro Cache. Si un bogue ne se reproduit qu'après un reload — c'est un signe d'incompatibilité des modifications avec l'état existant.
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