Комментарии (2)
🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Hot Reload vs Hot Restart в Flutter
Hot Reload и Hot Restart — это два разных механизма переидентификации кода во время разработки. Оба ускоряют цикл разработки, но работают по-разному и применяются в разных ситуациях.
Hot Reload — быстрое обновление UI
Hot Reload инжектирует изменённый код в уже работающее приложение БЕЗ перезагрузки. Это происходит в течение 1-2 секунд.
Как работает Hot Reload:
// Было
class MyButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: () => print('Clicked'),
child: Text('Click me'),
style: ElevatedButton.styleFrom(
backgroundColor: Colors.blue,
),
);
}
}
// Изменили цвет
class MyButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: () => print('Clicked'),
child: Text('Click me'),
style: ElevatedButton.styleFrom(
backgroundColor: Colors.red, // Изменили цвет!
),
);
}
}
// РЕЗУЛЬТАТ:
// - Код сразу переинжектился
// - Кнопка стала красной
// - Приложение продолжает работу (состояние сохранено)
// - Время: <1 секунда
Когда Hot Reload работает:
- Изменения в UI виджетах
- Стили и цвета
- Text и String
- Добавление новых методов
- Изменение логики в методах (не в initState)
Когда Hot Reload НЕ работает:
// Не работает: изменение initState
class MyWidget extends StatefulWidget {
@override
State<MyWidget> createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> {
late int counter;
@override
void initState() {
super.initState();
counter = 0; // Изменили значение на 10
// Hot Reload НЕ переинжектит initState!
// Нужен Hot Restart
}
}
// Не работает: изменение State класса
class _MyWidgetState extends State<MyWidget> {
int newField = 0; // Добавили новое поле
// Hot Reload НЕ пересоздаст State
// Нужен Hot Restart
}
// Не работает: изменение main() и runApp()
void main() {
// Добавили логику
// Hot Reload НЕ перезапустит main
// Нужен Hot Restart
}
Hot Restart — полная перезагрузка
Hot Restart перезагружает приложение, но БЕЗ полной пересборки и установки. Это занимает 2-5 секунд.
Как работает Hot Restart:
// Было
class _MyWidgetState extends State<MyWidget> {
@override
void initState() {
super.initState();
counter = 0;
}
}
// Изменили
class _MyWidgetState extends State<MyWidget> {
@override
void initState() {
super.initState();
counter = 10; // Изменили значение
}
}
// РЕЗУЛЬТАТ:
// - Приложение полностью перезагружается
// - main() вызывается заново
// - initState() вызывается заново
// - Состояние НЕ сохраняется
// - Время: 2-5 секунд
Когда использовать Hot Restart:
- Изменения в initState()
- Добавление/удаление полей в State
- Изменение main() или runApp()
- Изменение структуры маршрутов
- Добавление новых зависимостей
- Изменение констант, которые используются при инициализации
Сравнительная таблица
| Параметр | Hot Reload | Hot Restart |
|---|---|---|
| Время | < 1 сек | 2-5 сек |
| Состояние | Сохраняется | Сбрасывается |
| initState | Не перезапускается | Перезапускается |
| main() | Не перезапускается | Перезапускается |
| Сборка | Инжекция кода | Пересборка (без установки) |
| Использование | Частое | При необходимости |
Команды
Hot Reload
# При разработке в VS Code или Android Studio
# Просто сохрани файл (Ctrl+S / Cmd+S)
# Или нажми 'r' в терминале
flutter run
# Затем нажми 'r' для Hot Reload
Hot Restart
flutter run
# Нажми 'R' (заглавная) для Hot Restart
# Или используй команду:
flutter run --hot
Практические примеры
Пример 1: Hot Reload работает
class HomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('Home')), // Изменил "Home" на "Homepage"
body: Center(
child: Column(
children: [
Text('Welcome'), // Изменил "Welcome" на "Hello"
ElevatedButton(
onPressed: () {},
style: ElevatedButton.styleFrom(
backgroundColor: Colors.green, // Изменил цвет
),
child: Text('Click'),
),
],
),
),
);
}
}
// ✅ Hot Reload: все изменения видны сразу (< 1 сек)
Пример 2: Hot Reload НЕ работает
class HomePage extends StatefulWidget {
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
int counter = 0;
@override
void initState() {
super.initState();
counter = 5; // Изменил с 0 на 5
// ❌ Hot Reload НЕ переинжектит initState
// Нужен Hot Restart (R)
}
@override
Widget build(BuildContext context) {
return Text('Counter: $counter');
}
}
Пример 3: Hot Reload НЕ работает с State
class _HomePageState extends State<HomePage> {
int counter = 0;
String message = 'Hello'; // Добавил новое поле
// ❌ Hot Reload НЕ может обновить структуру State
// Нужен Hot Restart (R)
}
Debug изображение (Debug vs Release)
Hot Reload работает ТОЛЬКО в Debug режиме:
# Debug (Hot Reload работает)
flutter run
# Release (Hot Reload НЕ работает)
flutter run --release
# Profile
flutter run --profile
Общие проблемы
Hot Reload не работает
// Проблема 1: Изменение главного класса
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(primaryColor: Colors.blue), // Изменили
// ❌ Hot Reload может не работать
);
}
}
// Решение: используй Hot Restart (R)
Hot Reload зависает
# Используй Hot Restart вместо этого
flutter run
# Нажми R (не r)
Советы для эффективной разработки
-
Используй Hot Reload для:
- Быстрой итерации UI
- Тестирования стилей
- Проверки текста и цветов
-
Используй Hot Restart для:
- Изменения initState
- Добавления новых полей State
- Изменения маршрутов
- Сложных изменений архитектуры
-
Комбинируй оба:
- Hot Reload для 80% изменений
- Hot Restart для 20% сложных случаев
IDE Shortcuts
VS Code:
- Hot Reload:
Ctrl+Shift+;или сохрани файл - Hot Restart: терминал и нажми
R
Android Studio:
- Hot Reload:
Ctrl+\(Cmd+\on Mac) - Hot Restart:
Ctrl+Alt+\
Hot Reload и Hot Restart — это мощные инструменты, которые делают разработку на Flutter быстрой и приятной.