Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Как устроен Event Loop в Dart/Flutter
Event Loop — это ядро асинхронной модели Dart. Он обеспечивает неблокирующее выполнение кода и позволяет приложению обрабатывать множество операций параллельно, хотя выполнение кода остаётся однопоточным.
Архитектура Event Loop
Dart использует две очереди событий:
- Event Queue (очередь событий) — содержит операции ввода-вывода, таймеры, сетевые запросы
- Microtask Queue (очередь микрозадач) — содержит более приоритетные задачи, которые должны выполниться перед следующим событием
Порядок выполнения
Цикл Event Loop работает в следующем порядке:
- Выполни основной код (main) до конца
- Выполни все микрозадачи из Microtask Queue (в порядке добавления)
- Выполни одно событие из Event Queue
- Вернись к шагу 2
Пример с кодом
void main() {
print("1. Начало");
// Добавляем в Event Queue
Future(() => print("3. Future"));
// Добавляем в Microtask Queue (выполнится перед Future)
scheduleMicrotask(() => print("2. Microtask"));
print("4. Конец");
}
// Вывод:
// 1. Начало
// 4. Конец
// 2. Microtask
// 3. Future
Практический пример с async/await
Future<void> demonstrateEventLoop() async {
print("1. Старт");
await Future.delayed(Duration(milliseconds: 100));
print("2. После Future.delayed");
scheduleMicrotask(() => print("3. Microtask в конце"));
print("4. Синхронный код после await");
}
void main() {
demonstrateEventLoop();
print("5. main завершён");
}
// Вывод:
// 1. Старт
// 5. main завершён
// 2. После Future.delayed
// 4. Синхронный код после await
// 3. Microtask в конце
Применение во Flutter
Понимание Event Loop критично при работе с:
- setState — изменения будут применены в следующем цикле Event Loop
- async операции — запросы к API, чтение файлов помещаются в Event Queue
- анимации — каждый кадр (frame) требует выполнения в Event Loop
- производительность — долгие синхронные операции блокируют UI
Оптимизация и best practices
Избегай блокирующих операций в основном потоке:
// ❌ Плохо — блокирует UI
void fetchData() {
final response = http.get(url); // Синхронный вызов
process(response);
}
// ✅ Хорошо — не блокирует UI
Future<void> fetchData() async {
final response = await http.get(url); // Асинхронный вызов
process(response);
}
Используй compute() для тяжелых вычислений:
// Выполнит функцию на отдельном изоляте
final result = await compute(heavyFunction, data);
Ограничивай количество одновременных операций:
final futures = <Future>[];
for (var i = 0; i < 1000; i++) {
futures.add(fetchItem(i));
}
await Future.wait(futures); // Может быть слишком много
// Лучше использовать concurrency limit
final pool = Pool(5);
for (var i = 0; i < 1000; i++) {
await pool.withResource(() => fetchItem(i));
}
Заключение
Event Loop — это фундамент асинхронности в Dart. Хорошее понимание его работы позволяет писать отзывчивые приложения, избегать зависаний UI и правильно организовать асинхронный код в Flutter приложениях.