我正在尝试在Dio中使用Interceptor和Dio,我必须处理令牌过期。以下是我的代码
Future<Dio> getApiClient() async { token = await storage.read(key: USER_TOKEN); _dio.interceptors.clear(); _dio.interceptors .add(InterceptorsWrapper(onRequest: (RequestOptions options) { // Do something before request is sent options.headers["Authorization"] = "Bearer " + token; return options; },onResponse:(Response response) { // Do something with response data return response; // continue }, onError: (DioError error) async { // Do something with response error if (error.response?.statusCode == 403) { // update token and repeat // Lock to block the incoming request until the token updated _dio.interceptors.requestLock.lock(); _dio.interceptors.responseLock.lock(); RequestOptions options = error.response.request; FirebaseUser user = await FirebaseAuth.instance.currentUser(); token = await user.getIdToken(refresh: true); await writeAuthKey(token); options.headers["Authorization"] = "Bearer " + token; _dio.interceptors.requestLock.unlock(); _dio.interceptors.responseLock.unlock(); _dio.request(options.path, options: options); } else { return error; } })); _dio.options.baseUrl = baseUrl; return _dio; }
问题是Dio不再使用新令牌重复网络调用,而是将错误对象返回到调用方法,后者又呈现了错误的小部件,有关如何使用dio处理令牌刷新的任何线索?
我通过以下方式使用拦截器解决了它:
Future<Dio> getApiClient() async { token = await storage.read(key: USER_TOKEN); _dio.interceptors.clear(); _dio.interceptors .add(InterceptorsWrapper(onRequest: (RequestOptions options) { // Do something before request is sent options.headers["Authorization"] = "Bearer " + token; return options; },onResponse:(Response response) { // Do something with response data return response; // continue }, onError: (DioError error) async { // Do something with response error if (error.response?.statusCode == 403) { _dio.interceptors.requestLock.lock(); _dio.interceptors.responseLock.lock(); RequestOptions options = error.response.request; FirebaseUser user = await FirebaseAuth.instance.currentUser(); token = await user.getIdToken(refresh: true); await writeAuthKey(token); options.headers["Authorization"] = "Bearer " + token; _dio.interceptors.requestLock.unlock(); _dio.interceptors.responseLock.unlock(); return _dio.request(options.path,options: options); } else { return error; } })); _dio.options.baseUrl = baseUrl; return _dio; }