На каком потоке выполняются сетевые запросы в Dart/Flutter?

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

Ответ

В Dart сетевые запросы выполняются асинхронно, не блокируя основной изолят (Isolate), в котором работает UI. Dart использует event-loop и модель Future/async/await.

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

  • Код await освобождает event-loop, позволяя выполняться другим задачам (обработке ввода, таймерам, микрозадачам).
  • Сам ввод-вывод (IO) делегируется операционной системе, и когда ответ готов, Future завершается, и выполнение кода после await продолжается в том же изоляте.
  • Для тяжелых синхронных вычислений в ответе на сетевой запрос нужно использовать compute или Isolate.spawn, чтобы не заблокировать event-loop.

Пример с http:

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

Future<void> fetchUserData() async {
  try {
    // Запрос выполняется асинхронно. Пока система ждет ответа,
    // event-loop может обрабатывать другие события.
    final response = await http.get(
      Uri.parse('https://api.example.com/user'),
    );
    if (response.statusCode == 200) {
      // Обработка ответа происходит уже в основном изоляте.
      final data = jsonDecode(response.body);
      print('User: ${data['name']}');
    }
  } catch (e) {
    print('Request failed: $e');
  }
}

Почему это важно: Если бы запросы выполнялись синхронно в UI-потоке, интерфейс бы "замирал" на время ожидания ответа от сервера.