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

Что такое Flutter Inspector и DevTools?

1.0 Junior🔥 92 комментариев
#Другое

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Flutter Inspector и DevTools

Что такое DevTools?

Flutter DevTools — это набор инструментов отладки и профилирования для разработки приложений на Flutter. Это веб-интерфейс, который подключается к работающему приложению.

Как запустить DevTools?

# Способ 1: Автоматически из IDE
# В VS Code или Android Studio нажмите:
# "Open DevTools in Browser" в статус-баре

# Способ 2: Из командной строки
flutter pub global activate devtools
flutter devtools

# DevTools откроется в браузере на http://localhost:9100

# Способ 3: Подключить к уже запущенному приложению
# После flutter run выполните:
flutter devtools

Inspector (Инспектор виджетов)

Inspector показывает дерево виджетов, их свойства и расположение:

// Если у вас есть такой код:
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("My App"),
      ),
      body: Center(
        child: Column(
          children: [
            Text("Hello"),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: () {},
              child: Text("Press me"),
            ),
          ],
        ),
      ),
    );
  }
}

// Inspector покажет дерево:
// MyApp (StatelessWidget)
// └─ Scaffold
//    ├─ AppBar
//    │  └─ Text("My App")
//    └─ Center
//       └─ Column
//          ├─ Text("Hello")
//          ├─ SizedBox
//          └─ ElevatedButton
//             └─ Text("Press me")

Функции Inspector

1. **Select Widget Mode** — нажать на виджет в приложении
   - Показывает код и свойства
   - Показывает расположение в дереве
   - Показывает размеры и отступы

2. **Show Debug Paint** — раскрасить границы виджетов
   - Видно, как они расположены
   - Полезно для отладки layout

3. **Show Layout Explorer** — подробное отображение layout
   - Все размеры и отступы
   - Flex коэффициенты
   - Constraints

4. **Highlight Repaints** — показать, какие виджеты пересчитываются
   - Помочь найти лишние rebuild
   - Оптимизировать производительность

Performance (Производительность)

Performance таб показывает:

  • FPS (кадры в секунду)
  • Время на построение виджетов
  • Время на рендеринг
  • Отправку результата на экран
// Если виджет медленно пересчитывается, вы увидите в Performance:
// Frame: 16.7ms (для 60 FPS)
// Build: 5ms ✓ (быстро)
// Layout: 3ms ✓ (быстро)
// Paint: 2ms ✓ (быстро)
// Rasterize: 2ms ✓ (быстро)
// Jank: нет ✓

// Или проблемные фреймы:
// Frame: 50ms ✗ (медленно! Должно быть < 16.7ms для 60 FPS)
// Build: 30ms ✗ (слишком медленно)
// Layout: 15ms ✗ (слишком медленно)

Memory (Память)

Memory таб показывает:

  • Использование памяти (heap size)
  • Утечки памяти
  • Распределение памяти по объектам
# Для поиска утечек памяти:
1. Откройте Memory tab в DevTools
2. Нажимите "Trigger GC" (сборка мусора)
3. Выполните какое-то действие в приложении
4. Нажимите "Trigger GC" ещё раз
5. Посмотрите, выросла ли память

# Если память выросла — возможна утечка

Logging (Логирование)

Logging таб показывает все логи из приложения:

// Выводить логи
print("Debug message"); // Появится в Logging таб

import "package:flutter/foundation.dart";

if (kDebugMode) {
  print("This message appears only in debug mode");
}

// Можно фильтровать по уровню:
// Info, Warning, Error и т.д.

Network (Сеть)

Network таб показывает все сетевые запросы:

// Все HTTP запросы видны в Network таб
import "package:http/http.dart" as http;

Future<void> fetchData() async {
  final response = await http.get(
    Uri.parse("https://api.example.com/data"),
  );
  // Этот запрос появится в Network таб
}

// Вы увидите:
// - URL запроса
// - Метод (GET, POST, и т.д.)
// - Статус ответа (200, 404, и т.д.)
// - Время ответа
// - Размер ответа
// - Полный текст ответа

Debugger (Отладчик)

Debugger таб позволяет:

  • Ставить точки останова (breakpoints)
  • Пошагово выполнять код
  • Смотреть значения переменных
  • Вычислять выражения
class Counter extends StatefulWidget {
  @override
  State<Counter> createState() => _CounterState();
}

class _CounterState extends State<Counter> {
  int count = 0;

  void increment() {
    // Поставьте точку останова на эту строку
    count++; // ← Кликните слева — появится красная точка
    setState(() {});
    
    // Когда нажмёте кнопку, выполнение остановится здесь
    // Вы сможете:
    // - Посмотреть значение count
    // - Пошагово выполнять код (Step Over, Step Into)
    // - Перейти к следующей точке останова (Continue)
  }

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: increment,
      child: Text("Count: $count"),
    );
  }
}

Hot Reload vs Hot Restart

// Hot Reload (Горячая перезагрузка)
// Клавиша: R в flutter run или "Hot Reload" в IDE
flutter run
// После изменения кода, нажмите R
// Код обновится БЕЗ потери состояния

class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Text("Original"); // Измените на "Updated"
    // Нажмите R → текст обновится мгновенно
  }
}

// Hot Restart (Перезагрузка приложения)
// Клавиша: Shift+R в flutter run
// Приложение полностью перезагружается
// Состояние теряется

class MyStatefulWidget extends StatefulWidget {
  @override
  State<MyStatefulWidget> createState() => _MyStatefulWidgetState();
}

class _MyStatefulWidgetState extends State<MyStatefulWidget> {
  int count = 0; // При Hot Restart вернётся в 0

  @override
  Widget build(BuildContext context) {
    return Column(
      children: [
        Text("Count: $count"),
        ElevatedButton(
          onPressed: () => setState(() => count++),
          child: Text("Increment"),
        ),
      ],
    );
  }
}

Tips для отладки

// 1. debugPrint вместо print
import "package:flutter/foundation.dart";

debugPrint("Debug message"); // Лучше для больших сообщений

// 2. debugDumpApp() — вывести дерево виджетов
FlutterError.dumpErrorToConsole(
  FlutterErrorDetails(exception: Exception()), // dummy
);
debugDumpApp(); // Выведет всё дерево приложения

// 3. debugDumpRenderTree() — дерево render объектов
// debugDumpRenderTree();

// 4. Использовать assert() для проверок в debug режиме
assert(
  count >= 0,
  "Count cannot be negative",
); // Только в debug режиме

// 5. kDebugMode — проверка на debug режим
if (kDebugMode) {
  print("Only in debug mode");
}

Keyboard Shortcuts

Flutter Run:
  R — Hot Reload
  Shift+R — Hot Restart
  Q — Quit
  H — Help
  I — Toggle iOS simulator
  A — Toggle Android emulator
  W — Toggle Web
  
DevTools:
  Ctrl+Shift+P (или Cmd+Shift+P на Mac) — Открыть DevTools

Best Practices

  • Используйте Inspector для отладки layout
  • Смотрите Performance для поиска лишних rebuild
  • Используйте Debugger для пошагового выполнения
  • Мониторьте Memory для поиска утечек
  • Проверяйте Network для отладки API
  • Используйте debugPrint вместо print
  • Используйте Hot Reload для быстрой разработки

Итог

DevTools — это мощный инструмент для отладки и профилирования. Основные вкладки:

  • Inspector — дерево виджетов
  • Performance — производительность
  • Memory — использование памяти
  • Network — сетевые запросы
  • Debugger — пошаговое выполнение
  • Logging — логи приложения
Что такое Flutter Inspector и DevTools? | PrepBro