Hot Reload — technologie waarmee de code van een werkende mobiele app kan worden bijgewerkt zonder herstarten en verlies van de huidige status. De ontwikkelaar wijzigt de broncode — binnen een seconde worden de wijzigingen op het scherm van het apparaat of de emulator weergegeven. Dit is een belangrijk kenmerk van Flutter en React Native, die de ontwikkelingsiteraties radicaal versnelt: de tijd van de bewerkings-weergavecyclus wordt teruggebracht van 5–10 seconden (hercompilatie) naar 300–500 milliseconden. Volgens Flutter Documentation, 2025 voert hot reload een incrementele compilatie van gewijzigde code uit en stuurt de update naar Dart VM.
Belangrijkste punten
Hot Reload — een ontwikkelingsmechanisme waarbij de broncode wordt gewijzigd en toegepast op een reeds lopende app zonder deze te stoppen. De ontwikkelaar bewerkt het bestand, slaat het op en na 0.3–2 seconden verschijnt de bijgewerkte interface op het scherm. De status van de app (tellers, scrollpositie, ingevoerde gegevens) blijft behouden — de ontwikkelaar verliest de context niet.
Het concept van hot reload ontstond in vroege webhulpmiddelen (LiveReload, 2010) en werd aangepast voor mobiele ontwikkeling door de frameworks Flutter (2017) en React Native (2015). Tegenwoordig is hot reload een verplichte functie van moderne mobiele frameworks, naast debug-configuratie en profilering. Zonder hot reload wordt UI-ontwikkeling als ineffectief beschouwd: elke weergave van een wijziging vereist 10–30 seconden voor hercompilatie en opstarten.
Technisch gezien bestaat hot reload uit drie stappen: detectie van wijziging (file watcher), compilatie van gewijzigde code (incremental compiler) en toepassing (hot patching). Elk framework implementeert deze stappen op zijn eigen manier, maar het resultaat is hetzelfde: minimale vertraging tussen bewerking en weergave.
Hot Reload in Flutter is gebouwd op de architectuur van Dart VM en JIT-compilatie. Wanneer de ontwikkelaar op „Hot Reload” klikt in de IDE of het bestand opslaat, voert Flutter een incrementele compilatie uit van gewijzigde Dart-bibliotheken naar kernel-bestanden (.dill). Dart VM laadt deze bestanden en vervangt de implementaties van gewijzigde functies in de werkende app.
// Flutter widget met status behouden bij 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('Teller: $_counter'),
ElevatedButton(
onPressed: () => setState(() => _counter++),
child: Text('Verhogen'),
),
],
);
}
}
In het voorbeeld behoudt StatefulWidget CounterWidget het veld _counter tijdens hot reload. Dart VM hercreëert de status (State) door reassemble() aan te roepen, maar reset _counter niet — de waarde blijft behouden als de widget niet volledig wordt hercreëerd. Flutter roept reassemble() aan voor alle State-objecten en build() wordt opnieuw uitgevoerd met de actuele code en behouden status.
Wanneer hot reload niet werkt: als een statische initialisatievariabele (static const), globale variabele, main(), enum/mixin-klassedefinitie, code in @override initState() is gewijzigd. In deze gevallen is Hot Restart vereist. Volgens gegevens van Flutter Team (2025) is hot reload in 85–90% van de gevallen succesvol; 10–15% van de wijzigingen vereisen een volledige herstart.
Dart VM werkt in debug-modus als een JIT-compiler: het interpreteert Dart-code via het kernel-formaat (analoog aan bytecode). Hot reload laadt het nieuwe kernel-bestand en vervangt oude functiedefinities. De VM herstart geen isolates — alle asynchrone bewerkingen (Future, Stream) blijven werken. In release-modus wordt Dart AOT gecompileerd (dart2native) en is hot reload niet beschikbaar.
Fast Refresh (voorheen Hot Reloading) in React Native gebruikt Metro bundler — een JavaScript-modulebundler die bestandswijzigingen volgt. Wanneer de ontwikkelaar een bestand opslaat, compileert Metro alleen de gewijzigde module (HMR — Hot Module Replacement) en stuurt de update via WebSocket naar de werkende app.
// React Native component met statusbehoud bij hot reload
import React, { useState } from 'react';
import { View, Text, Button } from 'react-native';
const Counter = () => {
const [count, setCount] = useState(0);
return (
<View>
<Text>Teller: {count}Text>
<Button title="Verhogen"
onPress={() => setCount(c => c + 1)} />
View>
);
};
Fast Refresh behoudt de React-status (useState, useReducer) bij het bijwerken van de module. Metro HMR stuurt alleen het verschil van de gewijzigde module — niet de hele bundle. React Native gebruikt React Fast Refresh, ontwikkeld door het React-team (Dan Abramov, 2019): het genereert een nieuwe render voor de component, maar behoudt hook-statussen en props als de handtekening van de component niet is gewijzigd.
Fast Refresh werkt niet bij wijziging van: export van component, hooks (useEffect, useMemo), module-afhankelijkheden en native modules (Java/Objective-C). Voor dergelijke wijzigingen is Reload (volledig herladen van JS-bundle) of Rebuild (hercompilatie van native code) vereist. Fast refresh-tijd — 200–800 ms, volledige reload — 2–5 seconden.
Hot Reload en Hot Restart — twee modi voor het bijwerken van code met verschillende gebruiksscenario's. Hot Reload is geschikt voor UI-wijzigingen (stijlen, lay-out, kleuren, teksten), wanneer de klassestructuur en het type status niet veranderen. Hot Restart is nodig bij wijziging van methodehandtekeningen, toevoeging van nieuwe widgets/componenten in de rootstructuur, wijziging van initState en native modules.
| Kenmerk | Hot Reload | Hot Restart |
|---|---|---|
| Snelheid | 0.3–2 seconden | 2–10 seconden |
| Statusbehoud | Ja (variabelen, state, navigatiestack) | Nee (app wordt opnieuw gestart) |
| Compilatie | Incrementeel (alleen wijzigingen) | Volledige hercompilatie Dart/JS |
| Wanneer gebruiken | UI-aanpassingen, stijlen, teksten, lay-out | Structuurwijziging, nieuwe modules, native code |
| Flutter | Hot Reload (R) | Hot Restart (Shift + R) |
| React Native | Fast Refresh | Reload (Cmd + R) |
Aanbevolen strategie: begin met hot reload. Als wijzigingen niet zijn toegepast (IDE toont „Reload needed”) — voer hot restart uit. In Flutter verandert het pictogram van de knop: bliksem (⚡) voor hot reload, doorgestreepte bliksem — als restart vereist is. Ontwikkelingsefficiëntie met hot reload is 40–60% hoger in vergelijking met volledige hercompilaties (gegevens JetBrains Developer Survey 2024).
Code-injectie (code injection) — een gemeenschappelijk hot reload-mechanisme dat door alle frameworks wordt gebruikt. Het omvat drie fases. Eerste — detectie van wijziging: file watcher (ingebouwd in IDE) of het bestandssysteem (FSNotify) registreert een wijziging in een .dart-, .js-, .tsx-bestand. Tweede — compilatie: de incrementele compiler zet alleen het gewijzigde bestand om in een tussenliggende representatie (kernel .dill voor Dart, HMR-module voor JS). Derde — toepassing: nieuwe code wordt naar het apparaat gestuurd en vervangt oude definities in het geheugen van de werkende app.
Hot patching van functies — een techniek waarbij de runtime de functieaanwijzer (function pointer) in de virtuele methodentabel vervangt. Dart VM gebruikt ClassTable — een interne structuur die alle geladen klassen bevat. Bij hot reload vindt de VM de klasse in ClassTable en vervangt de functiedefinities door nieuwe uit het kernel-bestand. Alle bestaande instanties van de klasse krijgen automatisch het nieuwe gedrag.
// Flutter: reassemble-callback voor statusbeheer na hot reload
class MyWidget extends StatefulWidget {
@override
State createState() => _MyState();
}
mixin ReloadAware on State {
@override
void reassemble() {
super.reassemble();
// Cache of gegevens resetten na hot reload
clearCache();
}
}
In het voorbeeld overschrijft de mixin ReloadAware de methode reassemble(), die Dart VM op elk State-object aanroept na hot reload. De ontwikkelaar kan de cache resetten, bronnen opnieuw initialiseren of statusmigratie uitvoeren. Zonder deze methode kunnen oude gegevens in de cache blijven en inconsistentie veroorzaken na het bijwerken van widgets.
Hot patching werkt niet voor wijzigingen die herverdeling van geheugen voor nieuwe velden vereisen, wijziging van het type variabele in een klasse, toevoeging van nieuwe velden in StatefulWidget, wijziging van enum-waarden of generic-parameters. Deze wijzigingen zijn incompatibel met bestaande objecten in het geheugen — Dart VM kan geen velden „herschikken” in reeds toegewezen objecten. Voor dergelijke gevallen is een hot restart of volledige hercompilatie vereist.
Native Android en iOS-ontwikkeling heeft traditioneel geen volledige hot reload. Android Studio met Android 11+ en AGP 4.2+ ondersteunt Apply Changes: code bijwerken zonder de app te herstarten. Apply Changes werkt via Android Runtime (ART) — het vervangt methode-implementaties in dex-bestanden ter plekke. Apply Changes is echter beperkt: het werkt niet voor wijzigingen van bronnen (layout.xml, drawable), manifest en native bibliotheken.
Apple introduceerde Previews (SwiftUI Preview) in Xcode 15 (2023) — dit is geen hot reload in de klassieke zin. Previews compileren de voorbeeldsectie apart van de hoofdapp en tonen het resultaat in het Xcode-canvas. Bij het opslaan van een bestand wordt Preview in 1–3 seconden bijgewerkt, maar de app-status blijft niet behouden. Voor UIKit-projecten is hot reload beschikbaar via tools van derden: InjectionIII (John Holdsworth) en SwiftHotReload.
Kotlin Multiplatform (KMP) kreeg vanaf 2024 experimentele ondersteuning voor hot reload van JetBrains. Het mechanisme is gebaseerd op Kotlin/Native runtime met vervanging van functies in het objectbestand (.klib). JetBrains Compose Multiplayer gebruikt zijn eigen hot reload-implementatie, vergelijkbaar met Flutter: incrementele compilatie en vervanging van klassen in Kotlin/Native runtime. Snelheid — 1–3 seconden, alleen beschikbaar voor UI-wijzigingen.
Apply Changes — een mechanisme van Android Studio dat de ART runtime API gebruikt. Bij het opslaan van code bepaalt Android Studio welke klassen zijn gewijzigd en stuurt hun dex-bestanden naar het apparaat via adb. ART vervangt methode-implementaties in de werkende app zonder te stoppen. Apply Changes werkt in drie modi: Instant Run (snelle vervanging van methode), Swap (vervanging van klasse met hercreëren van instanties) en Restart Activity (als wijzigingen incompatibel zijn met de huidige status).
Veelgestelde vragen
Hot Reload werkt code bij zonder de app te herstarten en behoudt de status. Live Reload herlaadt de volledige app of webpagina bij wijziging van bestanden. Live Reload is eenvoudiger te implementeren, maar langzamer en verliest de status. Flutter en React Native gebruiken hot reload, web-tools gebruiken live reload.
Hot Reload werkt niet bij wijzigingen die geheugenherverdeling vereisen (nieuwe velden van een klasse), wijziging van statische constanten (static const), hernoemen van widgets, wijziging van enum of generic-parameters. Deze wijzigingen zijn incompatibel met bestaande objecten in het geheugen van Dart VM of JavaScript runtime.
Ja, hot reload werkt zowel op een fysiek apparaat als op een emulator. Flutter stuurt kernel-bestanden naar het apparaat via USB (adb forward) of Wi-Fi. React Native gebruikt WebSocket via metro bundler. De vertraging op een fysiek apparaat is meestal 10–30% hoger dan op een emulator.
Xcode Previews (sinds 2021) — een equivalent van hot reload voor SwiftUI, maar met beperkingen: de preview wordt apart gecompileerd, ondersteunt geen navigatie door de app en complexe statussen. Apple biedt geen officiële hot reload voor iOS. Tools van derden: InjectionIII en SwiftHotReload gebruiken Objective-C Runtime voor code-injectie.
Als na hot reload de UI onjuist wordt weergegeven: voer hot restart uit. Als het probleem in gegevens zit — controleer de reassemble()-callback in Flutter of useEffect cleanup in React Native. Voor aanhoudende problemen gebruik Flutter Clean of Reset Metro Cache. Als de bug alleen na reload optreedt — is dit een teken van incompatibiliteit van wijzigingen met de bestaande status.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook