根据未经授权的API响应注销

时间:2019-04-29 11:29:28

标签: dart flutter

我已经创建了这样的Rest API帮助器。

class Api {
  final String _url = baseUrl + "api/";

  _logout() async {
    // EXIT ALL ONGOING PROCESSES HERE & NAVIGATE TO LOGOUT SCREEN
    await navigatorKey.currentState.pushReplacement(
      MaterialPageRoute(
        builder: (context) => Login(),
      ),
    );

    return {'success': false, 'error': 'Authentication failed!'};
  }

  Future get(url) async {
    // Getting token from sharedprefs
    String token = Prefs.prefs.getString("token");

    // Set authorization header
    Map<String, String> headers = {
        'accept': 'application/json',
        'authorization': 'Bearer ' + token;
    };

    return await http.get(_url + url, headers: headers).then((response) {
      if (response.statusCode == 200) {
        // Valid response
        return convert.jsonDecode(response.body);
      } else {
        // 401 Status code
        return _logout();
      }
    });
  }
}

然后在屏幕/视图中,我这样调用API。

@override
void initState() {
  super.initState();

  Api().get('getdata').then((response) {
      setState(() {
        _data = response;
      })
  });
}

有效/未过期的API令牌

对于成功的api响应,将使用setstate方法在视图中更新获取的数据。运行正常。

用于无效/过期的API令牌

对于无效令牌,API将提供401状态代码,API帮助程序将使用_logout()函数导航至登录屏幕。

在这里,它没有按预期工作。这里的应用程序已推送到登录屏幕,但随后却给我这样的错误。

  

如果您在不再出现在小部件树中的小部件的State对象上调用setState(),则会发生此错误(例如,其父小部件不再在其构建中包含该小部件)。当代码从计时器或动画回调中调用setState()时,可能会发生此错误。首选解决方案是取消计时器或停止收听dispose()回调中的动画。另一种解决方案是在调用setState()之前检查此对象的“ mount”属性,以确保该对象仍在树中。

我的问题是,

这种基于REST API响应的注销方法正确吗?

编辑:

简单来说,我想在REST API帮助程序中得到未授权的响应时注销。

同样没有API帮助程序,对于每个位置手动编写if-else语句也不可行。

2 个答案:

答案 0 :(得分:0)

我认为您应该使用scoped_model来管理您的应用状态

查看软件包以获取有关其工作原理的更多信息 Link

答案 1 :(得分:0)

您正在做的是,当身份验证 过程失败导航登录屏幕 >

使用此按钮关闭所有先前的屏幕,并让用户登录i。 因此,当用户按下“后退”按钮时,它将改为关闭应用程序

Navigator.of(context)
        .pushNamedAndRemoveUntil('/login', (Route<dynamic> route) => false);

而且我认为您 API 应该像 json {status: 'success'}一样传递更多信息您还需要检查响应和正文内容以验证登录是否成功