Ответ
Архитектура Dart, на которой построен Flutter, использует однопоточную модель с изолятами (isolates) для параллелизма. Вот основные концепции:
-
Основной поток (Main Thread / UI Thread)
- Единственный поток, в котором работает весь код Flutter (Dart), включая построение виджетов, обработку событий и рендеринг UI.
- Критически важно не блокировать его долгими операциями, иначе интерфейс "зафризится".
-
Изолят (Isolate)
- Это не "поток" в классическом понимании, а отдельный контекст выполнения с собственной памятью (heap). Изоляты не разделяют память и общаются только через передачу сообщений (message passing).
- Идеально подходит для CPU-intensive задач (сортировка больших массивов, сложные вычисления), так как не блокирует UI.
// Пример использования Isolate.run (Dart 2.15+) для тяжелой задачи Future<void> performHeavyCalculation() async { final result = await Isolate.run(() { // Этот код выполняется в отдельном изоляте return expensiveCalculation(); // Допустим, вычисление 1 млн чисел Фибоначчи }); // Результат возвращается в основной изолят print('Result: $result'); }
-
Event Loop (Цикл событий)
- Механизм в основном изоляте для обработки асинхронных операций (
Future,Stream, таймеры, I/O). - Позволяет выполнять неблокирующие операции (например, сетевые запросы) без создания новых изолятов.
// Event Loop управляет выполнением этого кода Future<void> fetchData() async { final response = await http.get(Uri.parse('https://api.example.com/data')); // I/O операция не блокирует UI setState(() { data = jsonDecode(response.body); }); }
- Механизм в основном изоляте для обработки асинхронных операций (
Итог: Для I/O операций (сеть, файлы) я использую async/await и Event Loop. Для настоящих параллельных вычислений, нагружающих процессор, — изоляты. "Рабочие потоки" (Worker Threads) — это обычно нативные потоки платформы, которые Flutter использует "под капотом" для задач вроде рендеринга Skia или декодирования изображений.