Hot Restart — це механізм швидкого перезавантаження мобільного додатка під час розробки, при якому додаток повністю перезапускається з оновленим вихідним кодом. На відміну від повної перекомпіляції, Hot Restart використовує вже зкомпільований бінарний код та перезавантажує лише Dart VM, скорочуючи час циклу розробки. Згідно з документацією Flutter (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 team, 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.
Повний перезапуск (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, помилки підключення до бази даних, таймаути ініціалізації.
Четвертий сценарій — тестування порожнього стану. Hot Restart скидає весь стан додатка, що дозволяє перевірити поведінку при першому запуску: відображення онбордингу, запит дозволів, порожні списки та заглушки. Для повторюваного тестування це значно швидше, ніж перевстановлювати додаток.
Часті запитання
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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також