Hot Restart je mechanismus rychlého znovunačtení mobilní aplikace během vývoje, při kterém je aplikace zcela restartována s aktualizovaným zdrojovým kódem. Na rozdíl od úplné rekompilace Hot Restart využívá již zkompilovaný binární kód a znovu načítá pouze Dart VM, čímž zkracuje dobu vývojového cyklu. Podle Flutter documentation (2025) typický Hot Restart trvá 1 až 3 sekundy. Hot Restart je užitečný zejména při změně globálního stavu aplikace a inicializačního kódu.
Hlavní body
Hot Restart je vývojový mechanismus, při kterém je aplikace zcela znovu načtena s aktualizovaným zdrojovým kódem bez nutnosti úplné rekompilace projektu. Vývojář provede změny v kódu, uloží soubor a přes IDE odešle příkaz k restartu. Aplikace rekompiluje změněné soubory, restartuje Dart VM a znovu projde celým životním cyklem od main až po konečné vykreslení uživatelského rozhraní.
Hot Restart se liší od úplného přestavění tím, že využívá již zkompilované binární knihovny a framework Flutter bez rekompilace nativních obalů. Tím se zkracuje doba vývojového cyklu z několika minut na několik sekund. Podle průzkumu mezi Flutter vývojáři (2024) je průměrná doba Hot Restart 2,1 sekundy, což je přibližně o 97 % rychlejší než úplné přestavění projektu příkazem flutter build.
Mechanismus je velmi žádaný při vývoji uživatelských rozhraní, kde je vyžadována častá kontrola vizuálních změn. Vývojář může změnit barvu, velikost nebo pozici prvku a okamžitě vidět výsledek na simulátoru nebo fyzickém zařízení, aniž by ztratil kontext vývoje kvůli dlouhé kompilaci. To radikálně urychluje iterativní prototypování.
Při provádění příkazu Hot Restart probíhá sekvence operací: uložení změněných souborů, přírůstková kompilace změněných Dart souborů do strojového kódu, restart Dart VM a opětovné provedení vstupního bodu aplikace. Dart VM je virtuální stroj, který spouští Dart kód v režimu JIT (Just-In-Time) během vývoje a AOT (Ahead-Of-Time) v produkčních sestaveních.
Při Hot Restart aplikace prochází celým životním cyklem: volání funkce main, inicializace WidgetsFlutterBinding, spuštění runApp a vybudování celého widget stromu od nuly. Všechny předchozí stavy widgetů, proměnné a mezipaměti jsou vymazány. To zaručuje, že aplikace je v čistém stavu, zcela identickém se stavem po čerstvé instalaci na zařízení.
Proces lze znázornit jako posloupnost kroků: vývojář stiskne tlačítko Hot Restart v IDE, nástroje Flutter odešlou příkaz do zařízení, zařízení uloží aktuální kostru aplikace, restartuje Dart VM s novým kódem a znovu spustí main. Všechny závislosti registrované v kontejneru pro vkládání závislostí jsou vytvořeny od nuly.
Klíčová vlastnost — binární kód nativního obalu (pluginy, Kotlin kód, Swift kód) se nerekompiluje. Hot Restart ovlivňuje pouze Dart vrstvu aplikace, což zajišťuje vysokou rychlost restartu. Pokud změny ovlivňují nativní kód, je vyžadováno úplné spuštění flutter build.
Flutter používá architekturu, ve které je Dart kód spouštěn na Dart VM a UI je vykreslováno pomocí enginu Skia nebo Impeller. Při Hot Restart nástroje Flutter restartují izolovanou instanci Dart VM (isolate), načtou aktualizované .dill soubory (Dart Intermediate Language) a znovu spustí funkci main. Celé UI je znovu vybudováno voláním runApp, což zaručuje aktuálnost všech widgetů.
import 'package:flutter/material.dart';
void main() {
// Po Hot Restart se tato funkce provede znovu
var prefs = await SharedPreferences.getInstance();
var themeMode = prefs.getString('theme') ?? 'light';
runApp(MyApp(themeMode: themeMode));
}
Hot Restart a Hot Reload jsou dva mechanismy zrychleného vývoje, které jsou často zaměňovány. Hot Reload načítá změny do běžící aplikace bez ztráty aktuálního stavu, zatímco Hot Restart aplikaci zcela restartuje. Hot Reload funguje rychleji (0,1–1 sekunda), ale neaplikuje změny ovlivňující inicializaci nebo statická pole třídy.
Hlavní rozdíl — stav aplikace. Hot Reload uchovává aktuální stav widgetů: pozici posouvání, zadaná data, otevřená modální okna. Hot Restart resetuje celý stav do počátečního. Pokud se změna týká pouze kódu v metodě build, stačí Hot Reload. Pokud změna ovlivňuje main, globální proměnné nebo závislosti — je vyžadován Hot Restart.
Hot Reload aplikuje změny injektováním aktualizovaného kódu do Dart VM bez restartování isolate. To je možné pouze pro změny, které nenarušují strukturu typů a nevyžadují opětovnou inicializaci widgetů. Při Hot Restart je isolate zcela restartován, což umožňuje aplikovat jakékoli změny, včetně odstranění nebo přejmenování tříd a metod.
Podle týmu Flutter trvá Hot Reload u většiny změn méně než 1 sekundu, zatímco Hot Restart trvá 1 až 3 sekundy. Přibližně u 80 % změn uživatelského rozhraní stačí Hot Reload. Hot Restart je vyžadován při změně konfigurací aplikace, globálních proměnných, nativních pluginů v Dart obalu a architektonických rozhodnutí.
Doporučuje se následující strategie: používejte Hot Reload pro vizuální úpravy UI a malé změny logiky; přepněte na Hot Restart při změně datové struktury, přidávání závislostí nebo opravě inicializačního kódu. To minimalizuje čekací dobu a udržuje produktivitu vývoje na vysoké úrovni.
Mechanismus hot restart je implementován různě v závislosti na frameworku a programovacím jazyce. Flutter poskytuje nejvyspělejší implementaci Hot Restart prostřednictvím JIT kompilace Dart VM, zatímco React Native používá podobný mechanismus prostřednictvím Metro Bundler a JavaScript Core nebo Hermes.
Ve Flutter se Hot Restart aktivuje příkazem r v terminálu po spuštění aplikace přes flutter run. Alternativně — tlačítko Hot Restart v Android Studio, VS Code nebo IntelliJ IDEA. Hot Restart funguje pouze v režimu debug a není k dispozici v profile a release sestaveních. Při provádění nástroje Flutter rekompilují změněné soubory do formátu kernel a odešlou je do zařízení.
// Před Hot Restart: stará verze
class Counter extends StatefulWidget {
final int initialValue = 0;
// Po Hot Restart: nová hodnota vstoupí v platnost
// final int initialValue = 10;
}
class CounterState extends State<Counter> {
int _count = 0;
// Hot Reload zachová _count, Hot Restart resetuje na 0
}
Omezení Hot Restart ve Flutter — nemožnost uchování debug stavu. Po restartu jsou všechny body přerušení zachovány, ale hodnoty proměnných v ladicím nástroji jsou resetovány. Pro uchování stavu mezi restarty se používají mechanismy ukládání stavu aplikace State Restoration.
V React Native je hot restart implementován prostřednictvím Metro Bundler — nástroje pro sestavování JavaScript modulů. Při změně kódu Metro znovu sestaví změněné moduly a odešle aktualizovaný bundle do zařízení. React Native podporuje Fast Refresh — analog Hot Reload, který uchovává stav funkčních komponent pomocí React hooks.
Úplný restart (Reload) v React Native znovu načte JavaScript engine a celou aplikaci jako celek. To je plně analogické Hot Restart ve Flutter. Pro spuštění se používá kombinace Cmd+R na iOS simulátoru nebo dvojité stisknutí R na Androidu. Doba úplného restartu v React Native se pohybuje od 2 do 8 sekund v závislosti na velikosti bundle.
Hot Restart je nepostradatelný nástroj v řadě scénářů vývoje. První a nejzřejmější — změna globální konfigurace aplikace: designových motivů, lokalizace, poskytovatelů stavu. Pokud jste změnili poskytovatele v kořeni widget stromu nebo přidali nový modul do DI kontejneru, Hot Restart zaručuje správnou inicializaci všech komponent.
Druhý scénář — změna statických proměnných a konstant. V Dart jsou statická pole inicializována jednou při načtení třídy. Hot Reload neaplikuje změny statických polí, proto je pro jejich aktualizaci vyžadován Hot Restart. To je důležité zejména při práci s konfiguračními konstantami, URL adresami API a příznaky funkcí.
Třetí scénář — ladění inicializace: kontrola funkce main, úvodní obrazovky, načítání závislostí. Při každém Hot Restart aplikace prochází celým inicializačním cyklem, což umožňuje odhalit chyby, které se vyskytují pouze při spuštění — problémy s SharedPreferences, chyby připojení k databázi, časové limity inicializace.
Čtvrtý scénář — testování prázdného stavu. Hot Restart resetuje celý stav aplikace, což umožňuje zkontrolovat chování při prvním spuštění: zobrazení onboardingu, žádosti o oprávnění, prázdné seznamy a zástupné symboly. Pro opakované testování je to výrazně rychlejší než přeinstalace aplikace.
Často kladené otázky
Hot Restart zcela restartuje aplikaci a Dart VM, resetuje stav do počátečního. Hot Reload injektuje změny do běžící aplikace a uchovává aktuální stav UI. Hot Reload je rychlejší, ale není použitelný pro změny inicializace a globálních proměnných.
V terminálu po spuštění flutter run stiskněte klávesu R (Shift+R) pro Hot Restart. V Android Studio nebo VS Code použijte tlačítko Hot Restart na panelu ladění. Příkaz je dostupný pouze v režimu debug.
Typická doba Hot Restart je 1 až 3 sekundy pro projekty střední velikosti. Doba závisí na počtu Dart souborů, složitosti widget stromu a výkonu zařízení. U velkých projektů může doba dosáhnout 5–8 sekund.
Ne, Hot Restart je dostupný pouze v režimu debug. V release a profile sestaveních se používá AOT kompilace, která nepodporuje hot reload. Pro aktualizaci kódu v release je vyžadováno úplné přestavění.
Hot Restart neovlivňuje nativní kód — Kotlin, Swift nebo Java pluginy. Pokud jsou změny prováděny v nativním kódu pluginu, je vyžadováno úplné přestavění projektu. Hot Restart je účinný pouze pro Dart vrstvu aplikace.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také