Ответ
В 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-потоке, интерфейс бы "замирал" на время ожидания ответа от сервера.