Hot Restart и Hot Reload — такие знакомые каждому Flutter-разработчику понятия. Без них сейчас разработку уже и сложно представить — они делают ее значительно быстрее и проще.
Несмотря на популярность этих понятий, начинающие разработчики часто их путают, не до конца понимают в чем их отличия и как они работают под капотом. Разберемся!
Оба механизма используются при отладке кода. Они позволяют быстро применить внесенные изменения и тут же посмотреть, как они работают. Но чем отличаются?
⚡ Hot Reload не перезапускает программу с нуля. Он лишь «подмешивает» измененный код в уже запущенный процесс. Состояние приложения сохраняется.
Под капотом работает так:
1. Вы вносите изменения в код и запускаете Hot Reload
2. Flutter изучает, какие именно файлы вы изменили
3. Затем перекомпилируются только важные части: библиотеки с измененным кодом, основная библиотека и все библиотеки, связанные с измененными
4. Обновленный код преобразуется в специальный kernel-файл и поступает в Dart VM
5. Dart VM подтягивает новые версии библиотек, при этом сохраняя текущее состояние приложения
6. Flutter вызывает перестройку тех виджетов, которые были затронуты изменениями
Еще больше внутрянки можно узнать в статье Станислава Чернышева.
В итоге вы видите измененный интерфейс, функции работают по-новому, но состояние не сброшено.
При использовании Hot Reload очень важно помнить, что не все изменения могут примениться корректно. Он точно вам не подойдет, если:
✔️ вы меняете структуру класса (добавляете/удаляете поля, меняете их типы, меняете конструкторы)
✔️ вы заменяете глобальные переменные и синглтоны (например, экземпляры глобальных сервисов, которые могут повлиять на всю работу приложения)
✔️ вы обновляете код, выполняемый до runApp()
Это только часть случаев, поэтому вам важно самостоятельно внимательно отслеживать, как ведет себя ваше приложение при ряде Hot Reload
🔄 Hot Restart полностью перезапускает приложение. При этом сбрасываются абсолютно все состояния и данные. Проще этот механизм представить перезапуском
main() метода. Но важно, что сборка заново не пересобирается. Под капотом работает так:
1. Вы вносите изменения в код и запускаете Hot Restart
2. Dart VM очищает все сохраненные состояния, все значения переменных, пересоздает все объекты заново
3. Заново запускается метод main()
4. Приложение запускается как будто с нуля, но не затрагивается нативный код и движок Flutter
Визуально вам кажется, что приложение было закрыто и собирается заново, но это не так. И это важно понимать, потому что Hot Restart не может вам помочь, если вы:
✔️ обновили нативный код
✔️ внесли изменения в pubspec.yaml, подключили новые плагины или обновили старые, добавили новые assets
✔️ изменили платформенные зависимости (Gradle/Pods)
✔️ поменяли работу платформенных каналов (например, изменили названия)
✔️ обновили версии Dart или Flutter
Во всех этих перечисленных случаях вам потребуется полная остановка процесса и повторный запуск.
Если сравнивать по времени выполнения:
◾️ Hot Reload считается самым быстрым
◾️ Hot Restart быстрый, но медленнее, чем Hot Reload
◾️ Full Restart самый медленный
❤️ — если было полезно