Является ли Flutter однопоточным?

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

Ответ

Да, модель выполнения Dart, на котором построен Flutter, по умолчанию однопоточная. Это означает, что весь код приложения выполняется в одном потоке выполнения (часто называемом UI-потоком или main isolate).

Однако это не означает отсутствие параллелизма. Flutter активно использует асинхронное программирование и изоляты (Isolates) для неблокирующих операций.

  1. Асинхронность (Event Loop):

    • Долгие операции (сетевые запросы, чтение файлов) выполняются асинхронно с помощью Future и async/await.
    • Пока операция ожидает завершения (например, ответа от сервера), поток не блокируется и может обрабатывать другие события (анимации, жесты).
      Future<void> loadUserData() async {
      // Эта операция не блокирует UI.
      final response = await http.get(Uri.parse('https://api.example.com/user'));
      setState(() {
      userData = jsonDecode(response.body);
      });
      }
  2. Параллелизм через Isolates:

    • Для действительно тяжелых вычислений (обработка изображений, сложные алгоритмы), которые могут заморозить UI, используются Isolates.
    • Изолят — это отдельный поток выполнения с собственной памятью. Он не разделяет состояние с главным изолятом, что исключает проблемы с блокировками (locks). Общение происходит через передачу сообщений.
      // Пример использования compute (хелпер Flutter для запуска функции в отдельном изоляте).
      final result = await compute(heavyCalculation, inputData);

Итог: UI Flutter однопоточен для безопасности и простоты, но фреймворк предоставляет мощные инструменты (Event Loop, Isolates) для эффективной работы с асинхронными и параллельными задачами без "зависаний" интерфейса.