Сколько изолятов создает Flutter при запуске приложения?

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

Ответ

При запуске Flutter-приложения создается три основных изолята (Isolate), каждый из которых работает в отдельном потоке и имеет свою память:

  1. UI Isolate (Основной изолят): Запускает функцию main(), обрабатывает события (тапы, жесты), выполняет код Dart-приложения и строит слои (layer tree) для рендеринга. Только этот изолят имеет доступ к Flutter UI.
  2. GPU Isolate: Отвечает за преобразование layer tree в команды для графического процессора (GPU) через Skia (или Impeller).
  3. Platform Isolate (ранее "IO Isolate"): Обрабатывает асинхронные ввод-вывод, файловые операции и коммуникацию с нативной платформой (Android/iOS) через платформенные каналы (Platform Channels).

Пример создания своего изолята для тяжелых вычислений, чтобы не блокировать UI:

// Функция, которая будет запущена в новом изоляте
void _heavyTask(SendPort mainSendPort) {
  final result = performComplexCalculation();
  // Отправляем результат обратно в основной изолят
  mainSendPort.send(result);
}

// В основном UI-изоляте
Future<void> startBackgroundTask() async {
  final receivePort = ReceivePort();

  await Isolate.spawn(_heavyTask, receivePort.sendPort);

  // Слушаем ответ от нового изолята
  receivePort.listen((data) {
    print('Результат из изолята: $data');
    receivePort.close();
  });
}

Блокировка UI Isolate (например, долгим синхронным вычислением) приводит к "зависанию" интерфейса (jank).