Врући рестарт (Hot Restart) је механизам брзог поновног покретања мобилне апликације у процесу развоја, при којем се апликација у потпуности поново покреће са ажурираним изворним кодом. За разлику од потпуне рекомпилације, Hot Restart користи већ компиловани бинарни код и поново учитава само Dart VM, скраћујући време циклуса развоја. Према Flutter documentation (2025), типичан Hot Restart траје од 1 до 3 секунде. Hot Restart је посебно користан при промени глобалног стања апликације и кода иницијализације.
Главно
Врући рестарт (Hot Restart) је развојни механизам при којем се апликација у потпуности поново учитава са ажурираним изворним кодом без потребе за потпуном рекомпилацијом пројекта. Програмер уноси измене у код, чува датотеку и преко IDE-а шаље команду за поновно покретање. Апликација рекомпилира измењене датотеке, поново покреће Dart VM и изнова пролази кроз цео животни циклус од main до коначног приказивања корисничког интерфејса.
Hot Restart се разликује од потпуног поновног изграђивања по томе што користи већ компиловане бинарне библиотеке и Flutter оквир без рекомпилације изворних омотача. Ово скраћује време циклуса развоја са неколико минута на неколико секунди. Према анкети Flutter програмера (2024), просечно време Hot Restart-а је 2.1 секунда, што је око 97% брже од потпуног поновног изграђивања пројекта преко команде flutter build.
Механизам је посебно тражен при развоју корисничких интерфејса, где је потребна честа провера визуелних промена. Програмер може да промени боју, величину или положај елемента и тренутно види резултат на симулатору или физичком уређају, не губећи контекст развоја на дугу компилацију. Ово радикално убрзава итеративно прототипирање.
При извршавању команде Hot Restart долази до низа операција: чување измењених датотека, инкрементална компилација измењених Dart датотека у машински код, поновно покретање Dart VM и поновно извршавање улазне тачке апликације. Dart VM је виртуелна машина која извршава Dart код у JIT (Just-In-Time) режиму током развоја и AOT (Ahead-Of-Time) режиму у продукцијским изградњама.
При Hot Restart-у апликација пролази кроз потпуни животни циклус: позив функције main, иницијализација WidgetsFlutterBinding-а, покретање runApp и изградња целог стабла виџета од нуле. Сва претходна стања виџета, променљиве и кешеви се бришу. Ово гарантује да се апликација налази у чистом стању, потпуно идентичном стању након свеже инсталације на уређај.
Процес се може представити као низ корака: програмер притиска дугме Hot Restart у IDE-у, Flutter алати шаљу команду на уређај, уређај чува тренутни скелет апликације, поново покреће Dart VM са новим кодом и поново покреће main. Све зависности регистроване у контејнеру за убризгавање зависности се поново креирају од нуле.
Кључна карактеристика — бинарни код изворног омотача (прикључци, Kotlin код, Swift код) се не рекомпилира. Hot Restart утиче само на Dart слој апликације, што обезбеђује велику брзину поновног покретања. Ако промене утичу на изворни код, потребно је потпуно покретање flutter build.
Flutter користи архитектуру у којој се Dart код извршава на Dart VM, а UI се приказује преко мотора Skia или Impeller. При Hot Restart-у Flutter алати поново покрећу изоловану инстанцу Dart VM-а (isolate), учитавају ажуриране .dill датотеке (Dart Intermediate Language) и поново покрећу main функцију. Цео UI се изграђује изнова преко позива runApp, што гарантује ажурност свих виџета.
import 'package:flutter/material.dart';
void main() {
// Након Hot Restart-а ова функција се поново извршава
var prefs = await SharedPreferences.getInstance();
var themeMode = prefs.getString('theme') ?? 'light';
runApp(MyApp(themeMode: themeMode));
}
Hot Restart и Hot Reload су два механизма убрзаног развоја која се често мешају. Hot Reload учитава промене у апликацију која ради без губитка тренутног стања, док Hot Restart у потпуности поново покреће апликацију. Hot Reload ради брже (0.1–1 секунда), али не примењује промене које утичу на иницијализацију или статичка поља класе.
Главна разлика — стање апликације. Hot Reload чува тренутно стање виџета: позицију скроловања, унете податке, отворене модалне прозоре. Hot Restart ресетује цело стање на почетно. Ако се промена односи само на код у методи build, довољан је Hot Reload. Ако промена утиче на main, глобалне променљиве или зависности — потребан је Hot Restart.
Hot Reload примењује промене убризгавањем ажурираног кода у Dart VM без поновног покретања isolate-а. Ово је могуће само за промене које не нарушавају структуру типова и не захтевају поновну иницијализацију виџета. При Hot Restart-у isolate се у потпуности поново покреће, што омогућава примену било којих промена, укључујући брисање или преименовање класа и метода.
Према Flutter тиму, Hot Reload траје мање од 1 секунде за већину промена, док Hot Restart траје од 1 до 3 секунде. За приближно 80% промена корисничког интерфејса довољан је Hot Reload. Hot Restart је потребан при промени конфигурација апликације, глобалних променљивих, изворних прикључака у Dart омотачу и архитектонских одлука.
Препоручује се следећа стратегија: користите Hot Reload за визуелне исправке UI и мале промене логике; пређите на Hot Restart при промени структуре података, додавању зависности или исправљању кода иницијализације. Ово минимизира време чекања и одржава продуктивност развоја на високом нивоу.
Механизам врућег рестарта је имплементиран различито у зависности од оквира и програмског језика. Flutter пружа најзрелију имплементацију Hot Restart-а кроз JIT компилацију Dart VM, а React Native користи сличан механизам кроз Metro Bundler и JavaScript Core или Hermes.
У Flutter-у, Hot Restart се активира командом r у терминалу након покретања апликације преко flutter run. Алтернативно — дугме Hot Restart у Android Studio, VS Code или IntelliJ IDEA. Hot Restart ради само у debug режиму и није доступан у profile и release изградњама. При извршавању, Flutter алати рекомпилирају измењене датотеке у kernel формат и шаљу их на уређај.
// Пре Hot Restart-а: стара верзија
class Counter extends StatefulWidget {
final int initialValue = 0;
// Након Hot Restart-а: нова вредност ступа на снагу
// final int initialValue = 10;
}
class CounterState extends State<Counter> {
int _count = 0;
// Hot Reload ће сачувати _count, Hot Restart ће ресетовати на 0
}
Ограничење Hot Restart-а у Flutter-у — немогућност чувања стања отклањања грешака. Након поновног покретања, све тачке прекида се чувају, али вредности променљивих у отклањачу грешака се ресетују. За чување стања између поновних покретања користе се механизми чувања стања апликације State Restoration.
У React Native-у, врући рестарт је имплементиран кроз Metro Bundler — састављач JavaScript модула. При промени кода, Metro поново саставља измењене модуле и шаље ажурирани сноп на уређај. React Native подржава Fast Refresh — аналог Hot Reload-а који чува стање функционалних компоненти помоћу React hooks-ова.
Потпуно поновно покретање (Reload) у React Native-у поново учитава JavaScript мотор и целу апликацију у целини. Ово је потпуно аналогно Hot Restart-у у Flutter-у. За покретање се користи комбинација Cmd+R на iOS симулатору или двоструки притисак R на Android-у. Време потпуног поновног покретања у React Native-у варира од 2 до 8 секунди у зависности од величине снопа.
Hot Restart је незаменљив алат у низу сценарија развоја. Први и најочигледнији — промена глобалне конфигурације апликације: тема дизајна, локализација, провајдера стања. Ако сте променили провајдера у корену стабла виџета или додали нови модул у DI контејнер, Hot Restart гарантује исправну иницијализацију свих компоненти.
Други сценарио — промена статичких променљивих и константи. У Dart-у, статичка поља се иницијализују једном приликом учитавања класе. Hot Reload не примењује промене статичких поља, па је за њихово ажурирање обавезан Hot Restart. Ово је посебно актуелно при раду са конфигурационим константама, URL адресама API-ја и заставицама функција.
Трећи сценарио — отклањање грешака иницијализације: провера рада main функције, splash екрана, учитавања зависности. При сваком Hot Restart-у, апликација пролази кроз потпуни циклус иницијализације, што омогућава откривање грешака које се јављају само при покретању — проблеми са SharedPreferences, грешке повезивања са базом података, timeout-ови иницијализације.
Четврти сценарио — тестирање празног стања. Hot Restart ресетује цело стање апликације, што омогућава проверу понашања при првом покретању: приказ onboarding-а, захтев за дозволе, празне листе и чуваре места. За поновљиво тестирање, ово је знатно брже од поновне инсталације апликације.
Често постављана питања
Hot Restart у потпуности поново покреће апликацију и Dart VM, ресетујући стање на почетно. Hot Reload убризгава промене у апликацију која ради, чувајући тренутно стање UI-ја. Hot Reload је бржи, али није применљив за промене иницијализације и глобалних променљивих.
У терминалу након покретања flutter run притисните тастер R (Shift+R) за Hot Restart. У Android Studio или VS Code користите дугме Hot Restart на панелу за отклањање грешака. Команда је доступна само у debug режиму.
Типично време Hot Restart-а је од 1 до 3 секунде за пројекте средње величине. Време зависи од броја Dart датотека, сложености стабла виџета и перформанси уређаја. За велике пројекте, време може достићи 5–8 секунди.
Не, Hot Restart је доступан само у debug режиму. У release и profile изградњама користи се AOT компилација која не подржава вруће поновно учитавање. За ажурирање кода у release-у потребна је потпуна поновна изградња.
Hot Restart не утиче на изворни код — Kotlin, Swift или Java прикључке. Ако се промене уносе у изворни код прикључка, потребна је потпуна поновна изградња пројекта. Hot Restart је ефикасан само за Dart слој апликације.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође