Что такое асинхронность в Dart?

«Что такое асинхронность в Dart?» — вопрос из категории Асинхронность, который задают на 44% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Асинхронность в Dart — это модель выполнения, при которой долгие операции (сетевые запросы, чтение файлов, вычисления) не блокируют основной поток (изолят), отвечающий за отрисовку UI и обработку событий. Это критически важно для поддержания плавности интерфейса во Flutter.

Основные концепции:

  1. Future<T> — объект-обещание, который представляет результат (успешный T или ошибка) некоторой асинхронной операции, которая завершится в будущем.
  2. async / await — ключевые слова, которые позволяют писать асинхронный код в синхронном, линейном стиле, что гораздо читабельнее цепочек .then().
  3. Stream<T> — последовательность асинхронных событий, поступающих со временем (например, события от сервера через WebSocket, пользовательский ввод).

Практический пример (сетевой запрос):

import 'package:http/http.dart' as http;

Future<void> fetchUserData(String userId) async {
  // `await` приостанавливает выполнение этой функции, но НЕ основного потока.
  // Пока мы ждем ответа от сервера, UI может обрабатывать другие события.
  try {
    final response = await http.get(
      Uri.parse('https://api.example.com/users/$userId'),
    );

    if (response.statusCode == 200) {
      // Данные получены, можно обновить состояние виджета
      print('User data: ${response.body}');
    } else {
      throw Exception('Failed to load user. Status: ${response.statusCode}');
    }
  } on SocketException catch (e) {
    // Обработка ошибок сети
    print('Network error: $e');
  } catch (e) {
    // Обработка любых других ошибок
    print('Unexpected error: $e');
  }
}

// Использование:
// В методе initState() виджета или по нажатию кнопки:
// await fetchUserData('123');

Ключевые моменты:

  • Функция, содержащая await, должна быть помечена как async.
  • await не блокирует весь изолят, он лишь приостанавливает выполнение текущей асинхронной функции.
  • Ошибки в асинхронных операциях отлично ловятся стандартными блоками try/catch.
  • Для работы с множеством параллельных операций используют Future.wait().

Без асинхронности любая долгая операция "замораживала" бы интерфейс приложения.

Видео-ответы