如何在flutter中使用bloc在令牌或刷新令牌过期时将用户重定向到注销页面



这是我的基本存储库,它从区块中获取数据。我想在令牌到期或刷新令牌到期时将用户重定向到一个自定义页面,如注销。我更改页面,在blockconsumer或blocklistener中,但在这种情况下,这是一项愚蠢的工作,因为我应该在向服务器请求的任何地方用另一个blockmethod替换blockconsulter

@override
Future<Map<String, dynamic>> get(String url) async {
// Uri newUrl = Uri.parse(baseUrl + url);
var newUrl = baseUrl + url;
dio.Response response;
try {
// x.interceptors.add(dio.InterceptorsWrapper(
//   onError: (e, handler) {
//     if(e.response!.statusCode == 401)
//         redirect user to custom page
//   },
// ));
response = await dio.Dio()
.get(newUrl, options: dio.Options(headers: headersList))
.timeout(duration);
var result = _processResponse(response);
if (result.runtimeType.toString().toLowerCase() == 'string') {
return <String, String>{'key': result};
}
return result;
} on SocketException {
throw FetchDataException('internetConnection');
} on TimeoutException {
throw ApiNotRespondingException('api not found ');
} on Exception catch (e) {
var response = e as dio.DioError;
print(e.toString());
throw _handleError(response);
}
}

我最近问了自己同样的问题,并提出了这个解决方案(可能不是最好的(。

  1. 您需要一个单独的区块来包含jwt代币
  2. 将此区块初始化为单例。我使用将get_it用作DI的注射剂
@singleton
class TokenBloc extends Bloc<TokenEvent, TokenState> {
final ISecureStorage secureStorage;
TokenBloc(this.secureStorage) : super(TokenInitial()) {
on<TokenReseted>(delete);
on<TokenUpdated>(put);
}
put(event, emit) {
emit(TokenAuthentificated(event.accessToken, event.refreshToken));
secureStorage.write('accessToken', event.accessToken);
secureStorage.write('refreshToken', event.refreshToken);
}
delete(event, emit) {
emit(TokenDeleted());
emit(TokenInitial());
secureStorage.write('accessToken', null);
secureStorage.write('refreshToken', null);
}
}
  1. 用BlocProvider这样包装您的主页小部件
return BlocProvider.value(
value: getIt.get<TokenBloc>(),
child: const CupertinoApp(
home: Home(),
),
);
  1. 创建一个模块,用于从API请求新的刷新令牌,API将使用此TokenBloc更新/删除令牌。您可以使用getIt从RefreshTokenAPI访问TokenBloc
getIt.get<TokenBloc>().add(TokenReseted());
  1. 您所要做的就是倾听UI中TokenBloc的更改并进行重定向

就是这样。希望它能有所帮助:(

相关内容

  • 没有找到相关文章

最新更新