Retrofit & Dio Networking
Priority: P0 (CRITICAL)
Type-safe REST API communication using Dio and Retrofit.
Structure
infrastructure/
├── data_sources/
│ ├── remote/ # Retrofit abstract classes
│ └── local/ # Cache/Storage
└── network/
├── dio_client.dart # Custom Dio setup
└── interceptors/ # Auth, Logging, Cache
Implementation Workflow
- Define Retrofit clients — Create abstract classes with
@RestApi()and HTTP annotations (@GET,@POST). Methods returnFuture<DTO>. - Create DTOs — Use
@freezedand@JsonSerializablefor all request/response bodies. - Map to domain — Data sources must map DTOs to Domain Entities (e.g.,
userDto.toDomain()). - Guard enums — Always use
@JsonKey(unknownEnumValue: Status.unknown)to prevent crashes from new backend values. - Add auth interceptor — Inject
Authorization: Bearer <token>inonRequest. - Handle token refresh — On 401, lock Dio, call
refreshToken(), update stored token, retry viadio.fetch(err.requestOptions). - Map failures — Convert
DioExceptionto typedFailureobjects (ServerFailure, NetworkFailure).
Retrofit Client & Safe Enum DTO Examples
See implementation examples for RestClient definitions and safe enum DTO patterns.
Anti-Patterns
- ❌
jsonDecode(response.body)— use Retrofit's generated mappers, never manual JSON parsing - ❌ Static global
Dioinstance — inject Dio via DI; avoid global singletons - ❌
try-catchinside Retrofit interface methods — let the repository layer handle exceptions - ❌ Enum fields without
unknownEnumValue— new backend values will crash the app
Reference & Examples
For RestClient definitions and Auth Interceptor implementation: See references/REFERENCE.md.
Related Topics
feature-based-clean-architecture | error-handling