Repornirea la cald (Hot Restart) este un mecanism de reîncărcare rapidă a aplicației mobile în procesul de dezvoltare, prin care aplicația este repornită complet cu codul sursă actualizat. Spre deosebire de recompilarea completă, Hot Restart utilizează codul binar deja compilat și reîncarcă doar Dart VM, reducând timpul ciclului de dezvoltare. Conform Flutter documentation (2025), un Hot Restart tipic durează între 1 și 3 secunde. Hot Restart este util în special la modificarea stării globale a aplicației și a codului de inițializare.
Principalele puncte
Repornirea la cald (Hot Restart) este un mecanism de dezvoltare prin care aplicația este reîncărcată complet cu codul sursă actualizat fără a fi necesară recompilarea completă a proiectului. Dezvoltatorul face modificări în cod, salvează fișierul și trimite prin IDE comanda de repornire. Aplicația recompilează fișierele modificate, repornește Dart VM și parcurge din nou întregul ciclu de viață de la main până la randarea finală a interfeței utilizatorului.
Hot Restart se deosebește de reconstruirea completă prin faptul că utilizează bibliotecile binare deja compilate și framework-ul Flutter fără recompilarea învelitorilor native. Aceasta reduce timpul ciclului de dezvoltare de la câteva minute la câteva secunde. Conform unui sondaj al dezvoltatorilor Flutter (2024), timpul mediu al Hot Restart este de 2.1 secunde, ceea ce este cu aproximativ 97% mai rapid decât reconstruirea completă a proiectului prin comanda flutter build.
Mecanismul este deosebit de solicitat la dezvoltarea interfețelor utilizator, unde este necesară verificarea frecventă a modificărilor vizuale. Dezvoltatorul poate schimba culoarea, dimensiunea sau poziția unui element și poate vedea imediat rezultatul pe simulator sau pe dispozitivul fizic, fără a pierde contextul dezvoltării pentru o compilare lungă. Acest lucru accelerează radical prototiparea iterativă.
La executarea comenzii Hot Restart are loc o succesiune de operații: salvarea fișierelor modificate, compilarea incrementală a fișierelor Dart modificate în cod mașină, repornirea Dart VM și reexecutarea punctului de intrare al aplicației. Dart VM este o mașină virtuală care execută codul Dart în modul JIT (Just-In-Time) în timpul dezvoltării și AOT (Ahead-Of-Time) în build-urile de producție.
La Hot Restart, aplicația parcurge ciclul complet de viață: apelul funcției main, inițializarea WidgetsFlutterBinding, lansarea runApp și construirea întregului arbore de widget-uri de la zero. Toate stările anterioare ale widget-urilor, variabilele și cache-urile sunt șterse. Aceasta garantează că aplicația se află într-o stare curată, complet identică cu starea de după o instalare proaspătă pe dispozitiv.
Procesul poate fi reprezentat ca o succesiune de pași: dezvoltatorul apasă butonul Hot Restart în IDE, instrumentele Flutter trimit comanda pe dispozitiv, dispozitivul salvează scheletul aplicației curent, repornește Dart VM cu noul cod și lansează main din nou. Toate dependențele înregistrate în containerul de injectare a dependențelor sunt recreate de la zero.
Caracteristica cheie — codul binar al învelitorii native (plugin-uri, cod Kotlin, cod Swift) nu se recompilează. Hot Restart afectează doar stratul Dart al aplicației, ceea ce asigură o viteză mare de repornire. Dacă modificările afectează codul nativ, este necesară executarea completă a flutter build.
Flutter utilizează o arhitectură în care codul Dart este executat pe Dart VM, iar UI este randat prin motorul Skia sau Impeller. La Hot Restart, instrumentele Flutter repornesc instanța izolată a Dart VM (isolate), încarcă fișierele .dill actualizate (Dart Intermediate Language) și reexecută funcția main. Întregul UI este construit din nou prin apelul runApp, ceea ce garantează actualitatea tuturor widget-urilor.
import 'package:flutter/material.dart';
void main() {
// După Hot Restart această funcție se execută din nou
var prefs = await SharedPreferences.getInstance();
var themeMode = prefs.getString('theme') ?? 'light';
runApp(MyApp(themeMode: themeMode));
}
Hot Restart și Hot Reload sunt două mecanisme de dezvoltare accelerată care sunt adesea confundate. Hot Reload încarcă modificările în aplicația care rulează fără pierderea stării curente, iar Hot Restart repornește complet aplicația. Hot Reload funcționează mai rapid (0.1–1 secundă), dar nu aplică modificările care afectează inițializarea sau câmpurile statice ale clasei.
Principala diferență — starea aplicației. Hot Reload păstrează starea curentă a widget-urilor: poziția de scroll, datele introduse, ferestrele modale deschise. Hot Restart resetează întreaga stare la cea inițială. Dacă modificarea vizează doar codul din metoda build, este suficient Hot Reload. Dacă modificarea afectează main, variabilele globale sau dependențele — este necesar Hot Restart.
Hot Reload aplică modificările prin injectarea codului actualizat în Dart VM fără a reporni isolate-ul. Acest lucru este posibil doar pentru modificări care nu încalcă structura tipurilor și nu necesită reinițializarea widget-urilor. La Hot Restart, isolate-ul este repornit complet, ceea ce permite aplicarea oricăror modificări, inclusiv ștergerea sau redenumirea claselor și metodelor.
Conform echipei Flutter, Hot Reload durează mai puțin de 1 secundă pentru majoritatea modificărilor, în timp ce Hot Restart — între 1 și 3 secunde. Pentru aproximativ 80% din modificările interfeței utilizatorului este suficient Hot Reload. Hot Restart este necesar la modificarea configurațiilor aplicației, variabilelor globale, plugin-urilor native în învelitoarea Dart și a deciziilor arhitecturale.
Se recomandă următoarea strategie: utilizați Hot Reload pentru corecturile vizuale UI și modificările mici de logică; treceți la Hot Restart la modificarea structurii datelor, adăugarea dependențelor sau corectarea codului de inițializare. Aceasta minimizează timpul de așteptare și menține productivitatea dezvoltării la un nivel înalt.
Mecanismul de repornire la cald este implementat diferit în funcție de framework și limbajul de programare. Flutter oferă cea mai matură implementare a Hot Restart prin compilarea JIT a Dart VM, iar React Native utilizează un mecanism similar prin Metro Bundler și JavaScript Core sau Hermes.
În Flutter, Hot Restart se activează prin comanda r în terminal după lansarea aplicației prin flutter run. Alternativ — butonul Hot Restart din Android Studio, VS Code sau IntelliJ IDEA. Hot Restart funcționează doar în modul debug și nu este disponibil în build-urile profile și release. La execuție, instrumentele Flutter recompilează fișierele modificate în format kernel și le trimit pe dispozitiv.
// Înainte de Hot Restart: versiunea veche
class Counter extends StatefulWidget {
final int initialValue = 0;
// După Hot Restart: noua valoare va intra în vigoare
// final int initialValue = 10;
}
class CounterState extends State<Counter> {
int _count = 0;
// Hot Reload va păstra _count, Hot Restart va reseta la 0
}
Limitarea Hot Restart în Flutter — imposibilitatea de a păstra starea de debug. După repornire, toate punctele de întrerupere se păstrează, dar valorile variabilelor din debugger sunt resetate. Pentru păstrarea stării între reporniri se utilizează mecanismele de salvare a stării aplicației State Restoration.
În React Native, repornirea la cald este implementată prin Metro Bundler — instrumentul de construire a modulelor JavaScript. La modificarea codului, Metro reconstruiește modulele modificate și trimite bundle-ul actualizat pe dispozitiv. React Native suportă Fast Refresh — analogul Hot Reload care păstrează starea componentelor funcționale cu ajutorul hook-urilor React.
Repornirea completă (Reload) în React Native reîncarcă motorul JavaScript și întreaga aplicație în întregime. Acest lucru este complet analog cu Hot Restart din Flutter. Pentru lansare se utilizează combinația Cmd+R pe simulatorul iOS sau apăsarea dublă a tastei R pe Android. Timpul repornirii complete în React Native variază între 2 și 8 secunde în funcție de dimensiunea bundle-ului.
Hot Restart este un instrument indispensabil într-o serie de scenarii de dezvoltare. Primul și cel mai evident — modificarea configurației globale a aplicației: teme de design, localizare, furnizori de stare. Dacă ați schimbat furnizorul în rădăcina arborelui de widget-uri sau ați adăugat un modul nou în containerul DI, Hot Restart garantează inițializarea corectă a tuturor componentelor.
Al doilea scenariu — modificarea variabilelor statice și constantelor. În Dart, câmpurile statice se inițializează o singură dată la încărcarea clasei. Hot Reload nu aplică modificările câmpurilor statice, de aceea pentru actualizarea lor este obligatoriu Hot Restart. Acest lucru este deosebit de relevant la lucrul cu constante de configurare, adrese URL API și flag-uri de funcții.
Al treilea scenariu — debug-ul inițializării: verificarea funcționării funcției main, a ecranului splash, a încărcării dependențelor. La fiecare Hot Restart, aplicația parcurge ciclul complet de inițializare, ceea ce permite depistarea erorilor care apar doar la pornire — probleme cu SharedPreferences, erori de conectare la baza de date, timeout-uri de inițializare.
Al patrulea scenariu — testarea stării goale. Hot Restart resetează întreaga stare a aplicației, ceea ce permite verificarea comportamentului la prima lansare: afișarea onboarding-ului, solicitarea permisiunilor, liste goale și placeholdere. Pentru testarea repetabilă, aceasta este semnificativ mai rapid decât reinstalarea aplicației.
Întrebări frecvente
Hot Restart repornește complet aplicația și Dart VM, resetând starea la cea inițială. Hot Reload injectează modificări în aplicația care rulează, păstrând starea curentă a UI. Hot Reload este mai rapid, dar nu se aplică pentru modificări ale inițializării și variabilelor globale.
În terminal după lansarea flutter run apăsați tasta R (Shift+R) pentru Hot Restart. În Android Studio sau VS Code utilizați butonul Hot Restart din panoul de debug. Comanda este disponibilă doar în modul debug.
Timpul tipic al Hot Restart este de 1 până la 3 secunde pentru proiecte de dimensiune medie. Timpul depinde de numărul de fișiere Dart, complexitatea arborelui de widget-uri și performanța dispozitivului. Pentru proiecte mari, timpul poate ajunge la 5–8 secunde.
Nu, Hot Restart este disponibil doar în modul debug. În build-urile release și profile se utilizează compilarea AOT, care nu suportă reîncărcarea la cald. Pentru actualizarea codului în release este necesară reconstruirea completă.
Hot Restart nu afectează codul nativ — plugin-urile Kotlin, Swift sau Java. Dacă modificările sunt introduse în codul nativ al plugin-ului, este necesară reconstruirea completă a proiectului. Hot Restart este eficient doar pentru stratul Dart al aplicației.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și