-
-
Notifications
You must be signed in to change notification settings - Fork 1.5k
Closed as not planned
Labels
Description
Package
dio
Version
5.3.3
Operating-System
Android, Windows
Output of flutter doctor -v
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.16.0, on Microsoft Windows [Version 10.0.22621.2861], locale en-IN)
[✓] Windows Version (Installed version of Windows is version 10 or higher)
[✓] Android toolchain - develop for Android devices (Android SDK version 34.0.0)
[✓] Chrome - develop for the web
[✓] Visual Studio - develop Windows apps (Visual Studio Community 2022 17.8.2)
[✓] Android Studio (version 2022.2)
[✓] VS Code (version 1.85.2)
[✓] Connected device (4 available)
[✓] Network resources
• No issues found!Dart Version
3.2.0
Steps to Reproduce
import 'dart:convert';
import 'package:dio/dio.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:realm/realm.dart';
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
String appId = "someAppID";
final appConfig = AppConfiguration(appId);
final app = App(appConfig);
class DioInterceptor extends Interceptor {
final String baseul =
"some_base_url";
Dio dio = Dio();
final storage = new FlutterSecureStorage();
@override
Future onRequest(
RequestOptions options, RequestInterceptorHandler handler) async {
var accessToken = await storage.read(key: 'accessToken');
options.baseUrl = baseul;
options.headers.addAll({
"Content-Type": "application/json",
"Accept": "*/*",
});
if (accessToken != null && accessToken.isNotEmpty) {
options.headers['Authorization'] = 'Bearer $accessToken';
}
return super.onRequest(options, handler);
}
@override
void onResponse(Response response, ResponseInterceptorHandler handler) {
return handler.next(response);
}
@override
Future onError(DioError err, ErrorInterceptorHandler handler) async {
if (err.response?.statusCode == 401) {
await refreshToken();
print("eroror 4011");
try {
return handler.resolve(await _retry(err.requestOptions));
} on DioError catch (e) {
handler.next(e);
}
return;
}
return handler.next(err);
// return super.onError(err, handler);
}
Future<bool> refreshToken() async {
var refreshToken = await storage.read(key: 'refreshToken');
try {
var response = await dio.post(
"https://refresh-token",
options: Options(headers: {"Authorization": refreshToken}));
if (response.statusCode == 201) {
await storage.write(
key: 'accessToken',
value: response.access_token);
}
} catch (e) {
storage.deleteAll();
}
return true;
}
Future<Response<dynamic>> _retry(RequestOptions requestOptions) async {
var accessToken = await storage.read(key: 'accessToken');
print("on retyr========");
print(accessToken);
final options = Options(
method: requestOptions.method,
headers: {
"Authorization": "Bearer $accessToken",
},
);
print("path");
print(requestOptions.path);
print(requestOptions.baseUrl);
return dio.request<dynamic>(
requestOptions.path,
data: requestOptions.data,
queryParameters: requestOptions.queryParameters,
options: options,
);
}
}
// final dioProvider = Provider<DioInterceptor>((ref) {
// return DioInterceptor();
// });
1. Future<List<Data>> getUser() async {
final dio = Dio();
dio.interceptors.addAll([LogInterceptor(), DioInterceptor()]);
final response = await dio.get("/getBat");
if (response.statusCode == 200) {
final List body = response.data['data'] as List;
return body.map((e) => Data.fromJson(e)).toList();
} else {
return List.empty();
}
}Expected Result
on error should run and refreshed token should work,
even if i try to print in on error nothing is printing in the console so that I come to know onError working or not
Actual Result
On error is not working as soon as request fail and 401 returned I got into dio exeptions in dio mixins
antonxandre