Flutter 遇到http 401时进行颤振重定向
我现在有一个这样的导航:Flutter 遇到http 401时进行颤振重定向,flutter,Flutter,我现在有一个这样的导航: main>app>account>address 现在我遇到了一个问题,若用户获取地址并且他们的会话过期,我如何将他们重定向回登录页面?对于Flatter仍然是新手,无法找到如何将未经身份验证的状态发送到main以便重定向的电子解决方案 我用的是dio和MobX软件包 dio.interceptors .add(InterceptorsWrapper(onRequest: (RequestOptions options) async { S
main>app>account>address
现在我遇到了一个问题,若用户获取地址并且他们的会话过期,我如何将他们重定向回登录页面?对于Flatter仍然是新手,无法找到如何将未经身份验证的状态发送到main
以便重定向的电子解决方案
我用的是dio和MobX软件包
dio.interceptors
.add(InterceptorsWrapper(onRequest: (RequestOptions options) async {
SharedPreferences prefs = await SharedPreferences.getInstance();
String token = prefs.getString('access_token');
if (token != null) {
options.headers['Authorization'] = 'Bearer $token';
}
options.headers['Accept'] = 'application/json';
return options; //continue
}, onResponse: (Response response) {
final int statusCode = response.statusCode;
var results = {};
if (statusCode == 200 || statusCode == 201 || statusCode == 204) {
final dynamic decodeResponse = this.decodeResponse(response);
bool responseIsList = decodeResponse is List;
if (!responseIsList && decodeResponse['token'] != null) {
final token = decodeResponse['token'];
setAuthorizationToken(token['access_token'], token['refresh_token']);
}
if (responseIsList) {
return decodeResponse;
} else {
final resultToAdd = decodeResponse;
results.addAll(resultToAdd);
return results;
}
}
return response;
}, onError: (DioError e) async {
final r = e.response;
if (r.statusCode == 401) {
AuthStore().unauthorize(prefs: _sharedPreferences);
}
if (r != null) {
return {"has_error": true, ...r.data};
}
// Do something with response error
return e;
}));
我已尝试将Observer置于我的main.dart
上,以继续检查状态
@override
Widget build(BuildContext context) {
return Observer(builder: (_) {
if (store.statusAuth == 401) {
Navigator.pushReplacementNamed(context, '/'); // this is error
}
// other material app function
});
有解决办法吗
目前我唯一能想到的解决方案是每次调用API时(每个存储)都进行检查。如果401将自动发送回登录页面。但是这种方法是非常多余的。我也有同样的问题。为了解决这个问题,我们需要一个没有上下文的导航,以便在拦截器上导航。 Api服务在MaterialApp之前初始化。允许MaterialApp通过top navigator的导航工作 定义apiservice的拦截器并将其用于返回MaterialApp时,我创建了GlobalKey
final GlobalKey<NavigatorState> navigator;//Create a key for navigator
创建材质应用程序时:
MaterialApp(
...
navigatorKey: navigator,
...
)
如何在
\u configAuthApiService
中获取导航器
?我将导航器置于ApiService的构造函数中。谢谢,但没有帮助我。
MaterialApp(
...
navigatorKey: navigator,
...
)