onError method

  1. @override
void onError(
  1. DioException err,
  2. ErrorInterceptorHandler handler
)

Called when an exception was occurred during the request.

Implementation

@override
void onError(DioException err, ErrorInterceptorHandler handler) async {
  final status = err.response?.statusCode;
  if (status == null || !_statusCodes.contains(status)) {
    return handler.next(err);
  }

  final requestOptions = err.requestOptions;
  final currentHeader = requestOptions.headers['Authorization'];
  final currentToken = await _getToken();
  if ((currentHeader == null || currentHeader.toString().isEmpty) &&
      (currentToken == null || currentToken.isEmpty)) {
    return handler.next(err);
  }

  if (requestOptions.extra['_gp_refreshed'] == true) {
    return handler.next(err);
  }

  final newToken = await _refreshTokenOnce();
  if (newToken == null || newToken.isEmpty) {
    return handler.next(err);
  }

  requestOptions.headers['Authorization'] = 'Bearer $newToken';
  requestOptions.extra['_gp_refreshed'] = true;

  try {
    final response = await _dio.fetch(requestOptions);
    return handler.resolve(response);
  } on DioException catch (refreshErr) {
    return handler.next(refreshErr);
  } catch (_) {
    return handler.next(err);
  }
}