如何根据重试申请响应发布集团状态?
我尝试在我的应用程序中实现刷新令牌,因此每次请求时,dio都会检查响应,如果响应状态代码为401,则它将刷新访问令牌和重试该请求,
Future onError(DioError dioError, ErrorInterceptorHandler handler) async {
print(dioError.response!.statusCode);
int? responseCode = dioError.response!.statusCode;
String? oldAccessToken = _sharedPreferencesManager
.getString(SharedPreferencesManager.keyAccessToken);
if (oldAccessToken != null && responseCode == 401) {
_dio.interceptors.responseLock.lock();
_dio.interceptors.responseLock.lock();
String? refreshToken = _sharedPreferencesManager
.getString(SharedPreferencesManager.keyRefreshToken);
Map<String, dynamic> refreshTokenBody = {
'grant_type': 'refresh_token',
'refresh_token': refreshToken
};
ApiRepository apiAuthRepository = ApiRepository();
LoginModel token =
await apiAuthRepository.postRefreshAuth(refreshTokenBody);
if (token.success) {
String newAccessToken = token.data.accessToken;
String newRefreshToken = token.data.refreshToken;
await _sharedPreferencesManager.putString(
SharedPreferencesManager.keyAccessToken, newAccessToken);
await _sharedPreferencesManager.putString(
SharedPreferencesManager.keyRefreshToken, newRefreshToken);
}
RequestOptions options = dioError.response!.requestOptions;
options.headers.addAll({'requirestoken': true});
_dio.interceptors.requestLock.unlock();
_dio.interceptors.responseLock.unlock();
handler.next(dioError);
return _dio.request(options.path,
options: Options(headers: options.headers));
} else {
super.onError(dioError, handler);
}
}
如果我的bloc中的问题在我的bloc中,则我尝试使用已过期的访问令牌访问API(如果我尝试使用Active Access令牌,没有问题),DIO通过刷新和重试该请求可以正常工作,但是我的BLOC仅根据该请求发出加载/故障状态第一回应的结果,任何想法如何解决?
Future<void> mapEventToState(
Emitter<DashboardState> emit, DashboardEvent event) async {
emit(DashboardLoading());
DashboardModel getMe = await apiAuthRepository.getMeUser();
if (!getMe.success) {
emit(DashboardFailure(getMe.message));
}
emit(
DashboardSuccess(),
);
}
这是我实施集团的方式
BlocProvider<DashboardBloc>(
create: (_) => _dashboardBloc,
child: BlocListener<DashboardBloc, DashboardState>(
listener: (context, state) {
if (state is DashboardFailure)
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(state.error),
));
},
child: BlocBuilder<DashboardBloc, DashboardState>(
builder: (context, state) {
if (state is DashboardSuccess)
return ListView(..);
else if (state is DashboardLoading)
return Center(child: const CircularProgressIndicator());
else
print(state);
return Container();
I tried to implement a refresh token in my app, so every time I do request, dio will check the response, if the response status code is 401 then it will refresh the access token and retry the request
Future onError(DioError dioError, ErrorInterceptorHandler handler) async {
print(dioError.response!.statusCode);
int? responseCode = dioError.response!.statusCode;
String? oldAccessToken = _sharedPreferencesManager
.getString(SharedPreferencesManager.keyAccessToken);
if (oldAccessToken != null && responseCode == 401) {
_dio.interceptors.responseLock.lock();
_dio.interceptors.responseLock.lock();
String? refreshToken = _sharedPreferencesManager
.getString(SharedPreferencesManager.keyRefreshToken);
Map<String, dynamic> refreshTokenBody = {
'grant_type': 'refresh_token',
'refresh_token': refreshToken
};
ApiRepository apiAuthRepository = ApiRepository();
LoginModel token =
await apiAuthRepository.postRefreshAuth(refreshTokenBody);
if (token.success) {
String newAccessToken = token.data.accessToken;
String newRefreshToken = token.data.refreshToken;
await _sharedPreferencesManager.putString(
SharedPreferencesManager.keyAccessToken, newAccessToken);
await _sharedPreferencesManager.putString(
SharedPreferencesManager.keyRefreshToken, newRefreshToken);
}
RequestOptions options = dioError.response!.requestOptions;
options.headers.addAll({'requirestoken': true});
_dio.interceptors.requestLock.unlock();
_dio.interceptors.responseLock.unlock();
handler.next(dioError);
return _dio.request(options.path,
options: Options(headers: options.headers));
} else {
super.onError(dioError, handler);
}
}
The problem is in my Bloc, if I tried to access the API with the expired access token (If I tried using an active access token there is no problem), the dio works fine by refreshing and retrying the request, but my bloc only emits a Loading/Failure State based on the result of the first response, any idea how to solve it?
Future<void> mapEventToState(
Emitter<DashboardState> emit, DashboardEvent event) async {
emit(DashboardLoading());
DashboardModel getMe = await apiAuthRepository.getMeUser();
if (!getMe.success) {
emit(DashboardFailure(getMe.message));
}
emit(
DashboardSuccess(),
);
}
And here is how I implement the Bloc
BlocProvider<DashboardBloc>(
create: (_) => _dashboardBloc,
child: BlocListener<DashboardBloc, DashboardState>(
listener: (context, state) {
if (state is DashboardFailure)
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text(state.error),
));
},
child: BlocBuilder<DashboardBloc, DashboardState>(
builder: (context, state) {
if (state is DashboardSuccess)
return ListView(..);
else if (state is DashboardLoading)
return Center(child: const CircularProgressIndicator());
else
print(state);
return Container();
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论