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

Что такое dio?

1.0 Junior🔥 201 комментариев
#Работа с сетью

Комментарии (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 приложениях.