Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 遇到http 401时进行颤振重定向_Flutter - Fatal编程技术网

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,
    ...
)