Ответ
При запуске Flutter-приложения создается три основных изолята (Isolate), каждый из которых работает в отдельном потоке и имеет свою память:
- UI Isolate (Основной изолят): Запускает функцию
main(), обрабатывает события (тапы, жесты), выполняет код Dart-приложения и строит слои (layer tree) для рендеринга. Только этот изолят имеет доступ к Flutter UI. - GPU Isolate: Отвечает за преобразование layer tree в команды для графического процессора (GPU) через Skia (или Impeller).
- 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).