我已经创建了这样的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响应,将使用setstate方法在视图中更新获取的数据。它工作得非常好。
对于无效令牌,API将提供401状态代码,API助手将使用_logout()函数导航到登录屏幕。
在这里,它没有按预期工作。这里的应用程序推送到loginscreen,但它然后给我这样的错误。
如果在状态对象上调用不再出现在窗口小部件树中的窗口小部件(例如,其父窗口小部件不再包含其构建中的窗口小部件),则会发生此错误。当代码从计时器或动画回调中调用setState()时,可能会发生此错误。首选解决方案是取消计时器或停止侦听dispose()回调中的动画。另一种解决方案是在调用setState()之前检查此对象的“已挂载”属性,以确保该对象仍在树中。
这是基于REST API响应进行注销的正确方法吗?
简单来说,我想在REST API帮助程序中获得未经授权的响应时注销。
也没有API助手,为每个地方手动编写if-else语句是不可行的。
我认为你应该使用scoped_model来管理你的应用程序状态
查看包装,了解更多信息,了解Link的工作原理
您正在进行中,您可以做的是在身份验证过程失败时导航到登录屏幕
用它来关闭所有以前的屏幕并让用户登录i。因此,当用户按下后退按钮时,它将关闭应用程序
Navigator.of(context)
.pushNamedAndRemoveUntil('/login', (Route<dynamic> route) => false);
而且我认为你应该传递更多信息,如json {status: 'success'}
,所以你也检查响应和正文内容,以验证登录是否成功