Какие способы отладки (дебаггинга) в Flutter вы знаете?

«Какие способы отладки (дебаггинга) в Flutter вы знаете?» — вопрос из категории Тестирование, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Flutter я использую несколько подходов для отладки, в зависимости от ситуации:

1. Базовые методы для быстрой проверки:

// Простой вывод в консоль
print('Current state: $state');

// Для длинных строк без обрезки
debugPrint(jsonEncode(complexObject));

// Проверка условий только в debug-сборке
assert(user != null, 'User must be initialized');

2. Инструменты разработчика:

  • Flutter DevTools — основной инструмент для инспекции:
    • Widget Inspector — визуальное дерево виджетов и их свойства
    • Performance View — анализ рендеринга и jank
    • Network Profiler — мониторинг HTTP-запросов
    • Memory Profiler — отслеживание утечек памяти

3. Точки останова и пошаговая отладка в IDE (VS Code/Android Studio):

void fetchData() {
  final url = 'https://api.example.com/data'; // Брейкпоинт здесь
  final response = await http.get(Uri.parse(url));
  // Шаг за шагом можно проверить response
}

4. Структурированное логирование через пакеты:

dependencies:
  logger: ^2.0.0
final logger = Logger();
logger.d('Debug message');
logger.w('Warning: API rate limit接近');
logger.e('Error fetching data', error: e, stackTrace: s);

5. Командная строка Flutter:

# Просмотр логов устройства
flutter logs

# Запуск с флагами отладки
flutter run --verbose

# Профилирование производительности
flutter run --profile

6. Кастомные утилиты для сложных случаев:

// Отладка перестроений виджетов
class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    debugPrint('MyWidget rebuilt'); // Отслеживаем лишние rebuild
    return Container();
  }
}

// Визуальные маркеры для UI
debugPaintSizeEnabled = true; // Показывает границы виджетов

На практике я обычно начинаю с print() для быстрой проверки, затем перехожу к DevTools для анализа производительности, и в сложных случаях использую комбинацию брейкпоинтов и структурированного логирования.