在Dio中使用拦截器使Flutter刷新令牌

我正在尝试在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;

}

以上是 在Dio中使用拦截器使Flutter刷新令牌 的全部内容, 来源链接: utcz.com/qa/429129.html

回到顶部