Creare un custom interceptor in Dio
Dio è la libreria più usata per effettuar richieste HTTP in Dart e Flutter.
In questo articolo vediamo come creare un custom interceptor.
Può essere molto utile se ad esempio dobbiamo inviare un token ad ogni richiesta, o se abbiamo bisogno di avere info su ogni risposta.
Per prima cosa creiamo la nostra classe che estende Interceptor:
import 'package:dio/dio.dart';
class MyInterceptor extends Interceptor {
@override
void onRequest(RequestOptions options, RequestInterceptorHandler handler) {
options.headers['Authorization'] = 'Bearer TOKEN';
print(options.headers);
return handler.next(options);
}
@override
void onResponse(Response response, ResponseInterceptorHandler handler) {
print(response.data);
return handler.next(response);
}
@override
void onError(DioException err, ErrorInterceptorHandler handler) {
print(err.message);
return handler.next(err);
}
}
Ho messo un pò di print per visualizzare i dati in console.
Poi creiamo una classe che ci fa da service (non è necessario, ma è utile averla comunque quando sviluppate app che fanno diverse chiamate):
import 'package:dio/dio.dart';
import 'package:test_flutter/MyInterceptor.dart';
class MyService {
static final Dio _dio = Dio()..interceptors.add(MyInterceptor());
static Dio get dio => _dio;
}
Poi la nostra schermata; ha un semplice bottone che esegue la richiesta, non visualizzeremo i dati:
import 'package:flutter/material.dart';
import 'package:test_flutter/MyService.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Test',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const MyHomePage(title: 'Flutter Test'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
void _doRequest() async {
final url = 'URL';
final response = await MyService.dio.get(url);
// DO STUFF
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
onPressed: _doRequest,
child: Text('Premi'),
),
],
),
),
);
}
}
Enjoy!
dart flutter dio interceptor
Commentami!