Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Dio: HTTP клиент для Flutter
Dio — это мощный и гибкий HTTP клиент для Dart, который является стандартным выбором для работы с API в Flutter приложениях. Это аналог axios или fetch в JavaScript мире.
Основные возможности
- Request/Response интерцепторы — для логирования, авторизации
- Таймауты и retries — встроенная обработка сетевых ошибок
- Upload/Download — работа с файлами
- Cookie управление — автоматическое сохранение
- Трансформация данных — JSON serialization
Базовое использование
import 'package:dio/dio.dart';
final dio = Dio();
final response = await dio.get('https://api.example.com/users/1');
print(response.data);
final response = await dio.post(
'https://api.example.com/posts',
data: {'title': 'My Post'},
);
Конфигурация
final dio = Dio(
BaseOptions(
baseUrl: 'https://api.example.com',
connectTimeout: Duration(seconds: 5),
headers: {'Authorization': 'Bearer TOKEN'},
),
);
Интерцепторы
dio.interceptors.add(
InterceptorsWrapper(
onRequest: (options, handler) {
options.headers['Authorization'] = 'Bearer TOKEN';
return handler.next(options);
},
onError: (error, handler) {
if (error.response?.statusCode == 401) {
refreshToken();
}
return handler.next(error);
},
),
);
Работа с файлами
await dio.post(
'/upload',
data: FormData.fromMap({
'file': await MultipartFile.fromFile('path/to/file'),
}),
);
await dio.download(
'https://example.com/file.zip',
'path/to/save',
onReceiveProgress: (received, total) {
print((received / total * 100).toString() + ' %');
},
);
Отмена запросов
final cancelToken = CancelToken();
try {
final response = await dio.get('/data', cancelToken: cancelToken);
} on DioException catch (e) {
if (e.type == DioExceptionType.cancel) {
print('Request cancelled');
}
}
cancelToken.cancel();
Обработка ошибок
try {
final response = await dio.get('/user/999');
} on DioException catch (e) {
if (e.response?.statusCode == 404) {
print('User not found');
} else if (e.type == DioExceptionType.connectionTimeout) {
print('Connection timeout');
}
}
Архитектурный подход
class ApiClient {
late final Dio _dio;
ApiClient(String token) {
_dio = Dio(BaseOptions(
baseUrl: 'https://api.example.com',
headers: {'Authorization': 'Bearer TOKEN'},
));
}
Future<User> getUser(String id) async {
try {
final response = await _dio.get('/users/$id');
return User.fromJson(response.data);
} on DioException catch (e) {
throw ApiException(e.message ?? 'Unknown error');
}
}
}
Лучшие практики
- Используйте Singleton pattern для Dio инстанса
- Создавайте отдельный ApiClient класс
- Добавляйте интерцепторы для авторизации и логирования
- Обрабатывайте таймауты gracefully
- Используйте CancelToken для отмены при уходе со страницы
Dio — это essential tool для работы с REST API в Flutter приложениях.