Ответ
В классическом понимании (как в Java или C++) Dart не является многопоточным языком. Он использует модель изолятов (Isolates).
Изолят — это независимая единица выполнения со своей собственной памятью (кучей) и циклом событий (event loop). Изоляты не разделяют память, что полностью исключает состояние гонки (race conditions) и необходимость в блокировках (locks). Общение между изолятами происходит только через передачу сообщений.
Зачем это нужно во Flutter? Чтобы выполнять тяжелые вычисления (обработка изображений, сложная сортировка больших массивов, криптография) без "подвисаний" UI, который работает в главном изоляте.
Пример использования Isolate для тяжелых вычислений:
import 'dart:isolate';
// Функция, которая будет выполняться в новом изоляте.
// Она получает SendPort главного изолята, чтобы отправить ему результат.
void _heavyComputationInIsolate(SendPort mainIsolateSendPort) {
// Имитация долгой CPU-интенсивной задачи (например, вычисление числа Пи).
double result = 0;
for (int i = 0; i < 1000000000; i++) {
result += (i % 2 == 0 ? 1 : -1) / (2 * i + 1);
}
result *= 4;
// Отправляем результат обратно в главный изолят.
mainIsolateSendPort.send(result);
}
// Главная функция (выполняется в UI-изоляте).
Future<double> calculatePiAsync() async {
final receivePort = ReceivePort(); // Пор для получения сообщений.
// Создаем новый изолят и передаем ему SendPort нашего receivePort.
await Isolate.spawn(_heavyComputationInIsolate, receivePort.sendPort);
// Ожидаем первое (и в данном случае единственное) сообщение от изолята.
final result = await receivePort.first as double;
receivePort.close(); // Важно закрыть порт.
return result;
}
// Использование во Flutter виджете:
// void _startCalculation() async {
// final pi = await calculatePiAsync();
// setState(() { _result = pi; }); // Обновляем UI с результатом.
// }
Упрощенная альтернатива: compute()
Во Flutter есть удобная функция-обертка compute (из package:flutter/foundation.dart), которая скрывает ручное управление изолятами для чистых функций.
import 'package:flutter/foundation.dart';
double _heavyFunction(int iterations) {
// ... та же тяжелая логика ...
return result;
}
void _startCompute() async {
// Flutter сам создаст изолят, выполнит в нем _heavyFunction,
// вернет результат и закроет изолят.
final result = await compute(_heavyFunction, 1000000000);
print(result);
}
Итог: Dart реализует параллелизм через изоляты (без общей памяти), что безопаснее классических потоков и идеально подходит для задач, где нужно не блокировать UI.
Видео-ответы
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶