> Как устроена многопоточность в Dart (Flutter)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: Верме

Стек: Flutter

> Пример ответа

В Dart многопоточность реализована через изоляты (Isolates), а не через традиционные потоки. Каждый изолят работает в собственной памяти (heap) и имеет свой event loop, что исключает состояние гонки и необходимость в мьютексах. Основные моменты:

  • Главный изолят - UI-поток в Flutter, где выполняются виджеты и обработка событий.
  • Создание изолята: Isolate.spawn(function, message). Функция выполняется в новом изоляте, данные передаются через порты (SendPort/ReceivePort).
  • Обмен данными: только через сообщения (копирование или передача объектов, поддерживающих SendPort). Для сложных структур используйте dart:convert или пакет dart:isolate с TransferableTypedData.
  • Future и async/await - не многопоточность, а асинхронность в одном изоляте (например, для I/O или таймеров).
  • compute() в Flutter - удобная обёртка для запуска изолята: final result = await compute(heavyFunction, data);.
  • Ограничения: изоляты не разделяют глобальные переменные; для синхронизации используйте ReceivePort или пакет isolate с IsolateRunner.

Пример:

import 'dart:isolate';

void heavyTask(SendPort sendPort) {
  int result = 0;
  for (int i = 0; i < 100000000; i++) result += i;
  sendPort.send(result);
}

void main() async {
  final receivePort = ReceivePort();
  await Isolate.spawn(heavyTask, receivePort.sendPort);
  final result = await receivePort.first;
  print(result);
}

Для фоновых задач в Flutter используйте compute() или пакет workmanager для долгих операций.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью