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

问题描述 投票:0回答:2

我已经创建了这样的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;
      })
  });
}

For Valid/Un-Expired API Token

对于成功的api响应,将使用setstate方法在视图中更新获取的数据。它工作得非常好。

For Invalid/Expired API Token

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

在这里,它没有按预期工作。这里的应用程序推送到loginscreen,但它然后给我这样的错误。

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

My question is,

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

Edit:

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

也没有API助手,为每个地方手动编写if-else语句是不可行的。

dart flutter
2个回答
0
投票

我认为你应该使用scoped_model来管理你的应用程序状态

查看包装,了解更多信息,了解Link的工作原理


0
投票

您正在进行中,您可以做的是在身份验证过程失败时导航到登录屏幕

用它来关闭所有以前的屏幕并让用户登录i。因此,当用户按下后退按钮时,它将关闭应用程序

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

而且我认为你应该传递更多信息,如json {status: 'success'},所以你也检查响应和正文内容,以验证登录是否成功

© www.soinside.com 2019 - 2024. All rights reserved.