Dio con interceptores en Flutter: ejercicio resuelto
Dio con interceptores en Flutter: ejercicio resuelto
El paquete http cubre casos simples, pero en apps reales necesitas interceptores: lógica que se ejecuta automáticamente en cada petición o respuesta sin repetir código. Dio los implementa con una API limpia y es el cliente HTTP más usado en Flutter para producción.
Enunciado
Configura un cliente Dio que:
- Añada automáticamente el header
Authorization: Bearer <token>a todas las peticiones. - Logee método, URL y código de respuesta en consola.
- Capture errores 401 (sesión expirada) de forma centralizada y los convierta en una excepción tipada.
Implementa una pantalla que use ese cliente para cargar un post y muestre loading, resultado y error.
Dependencias
Solución en Flutter
Resultado esperado
- Al pulsar el botón, aparece el loader y en consola se imprime
→ GET https://jsonplaceholder.typicode.com/posts/1. - Tras la respuesta:
← 200 https://...y el título del post en pantalla. - El header
Authorization: Bearer mi-token-de-pruebase añade automáticamente a todas las peticiones sin escribirlo manualmente.
Errores frecuentes
- Añadir interceptores después de la primera petición: los interceptores se evalúan en el orden en que se añaden; añádelos al construir el cliente, no en el
initState. - No llamar a
handler.next(): si olvidas llamar anextenonRequest, la petición queda colgada indefinidamente. - Capturar
Exceptiongenérica en lugar deDioException:DioExceptioncontieneresponse,requestOptionsytype; usa esos campos para diagnósticos precisos.
Cuándo usar Dio vs http
| Necesidad | http | Dio |
|---|---|---|
| GET sencillo sin auth | ✅ | ✅ |
| Interceptores globales | ❌ | ✅ |
| Cancelación de peticiones | ❌ | ✅ |
| Subida de archivos (multipart) | tedioso | ✅ |
| Retry automático | manual | ✅ (con plugin) |
Aplicación práctica
En cualquier app con backend autenticado, este patrón elimina el copy-paste del header en cada petición y centraliza el manejo de sesión expirada, que de otro modo se dispersa por toda la app.
Siguiente ejercicio recomendado
- Timeout y retry en Flutter: ejercicio resuelto
- Auth con refresh token en Flutter: ejercicio resuelto
- Estados de carga, error y vacío en Flutter: ejercicio resuelto
- Todos los ejercicios de Flutter
Práctica guiada y siguiente paso
- Más ejercicios de Flutter
- Ejercicios C para reforzar fundamentos
- Programación en C en 100 ejercicios resueltos
- Ver el libro en Amazon (incluido en Kindle Unlimited)
- Suscribirte a la newsletter
FAQ
¿Puedo tener varios interceptores activos a la vez?
Sí. Dio los ejecuta en cadena en el orden en que los registras. Los de respuesta y error se ejecutan en orden inverso.
¿Cómo cancelo una petición en curso?
Pasa un CancelToken a la petición y llama a cancelToken.cancel() cuando necesites cancelarla (ej. al desmontar el widget).
¿Dio es compatible con null safety?
Sí. Desde la versión 5.x es null-safe y soporta tipos genéricos: _dio.get<Map<String, dynamic>>(...) para tipado fuerte.