← Назад к вопросам

Как работают асинхронные операции в Dart?

2.2 Middle🔥 201 комментариев
#Dart

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Асинхронные операции в Dart

Async/await в Dart построен на основе Future — объекта, который представляет потенциальное значение или ошибку, которые станут доступны в будущем. Это основа для неблокирующей разработки в Flutter.

Future: основной блок

Future — это placeholder для значения, которое будет доступно позже. Он может находиться в одном из трёх состояний:

  • Pending — операция в процессе
  • Completed with value — успешно завершена с результатом
  • Completed with error — завершена с ошибкой
Future<String> fetchData() {
  return Future.delayed(Duration(seconds: 2), () {
    return 'Data loaded';
  });
}

fetchData().then((result) {
  print(result);
}).catchError((error) {
  print('Error: $error');
});

async/await: синтаксический сахар

async/await упрощает работу с Future, делая код более читаемым. Функция с async всегда возвращает Future.

Future<String> fetchData() async {
  await Future.delayed(Duration(seconds: 2));
  return 'Data loaded';
}

final result = await fetchData();
print(result);

try {
  final data = await fetchData();
  print(data);
} on Exception catch (e) {
  print('Error: $e');
}

Микротаски vs Макротаски

Dart использует две очереди:

  • Microtask queue — высокий приоритет (Future, callbacks)
  • Macrotask queue — низкий приоритет (setTimeout, I/O)
print('1. Start');
Future(() => print('2. Future'));
print('3. Sync code');

Streams: Future на стероидах

Stream — это асинхронная последовательность событий.

Stream<int> countdownStream() async* {
  for (int i = 5; i > 0; i--) {
    yield i;
    await Future.delayed(Duration(seconds: 1));
  }
}

countdownStream().listen((value) {
  print('Countdown: $value');
}, onError: (error) {
  print('Error: $error');
});

Future.wait: параллельные операции

Future<void> loadAllData() async {
  final results = await Future.wait([
    fetchUser(),
    fetchPosts(),
    fetchComments(),
  ]);
}

Лучшие практики

  • Избегайте .then().then().then() — используйте async/await
  • Всегда обрабатывайте ошибки — try-catch или catchError
  • Отменяйте подписки — используйте StreamSubscription.cancel()
  • Используйте Future.wait для параллелизма — не await последовательно
  • Профилируйте перформанс — async операции могут повлиять на UI

Эти концепции — фундамент для работы с API, базами данных и real-time обновлениями в Flutter приложениях.