← Назад к вопросам

Чем отличается Hot Reload от Hot Restart?

1.6 Junior🔥 132 комментариев
#Компиляция

Комментарии (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 ReloadHot 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)

Советы для эффективной разработки

  1. Используй Hot Reload для:

    • Быстрой итерации UI
    • Тестирования стилей
    • Проверки текста и цветов
  2. Используй Hot Restart для:

    • Изменения initState
    • Добавления новых полей State
    • Изменения маршрутов
    • Сложных изменений архитектуры
  3. Комбинируй оба:

    • 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 быстрой и приятной.