我这里有一个问题。我不明白如何让应用程序在令牌更改时自动注销。
以下是调用API的类:
class Api {
static String? authToken;
static String authPhoneNumber = '';
static Future<Map<String, dynamic>> postData(
{String? phoneNumber,
String? token,
bool auth = false,
required String urlHttp}) async {
late Map<String, dynamic> responseData;
late Map<String, dynamic> kosong = {};
Map<String, dynamic> dataMap = {};
if (phoneNumber != null) {
dataMap['phoneNumber'] = phoneNumber;
}
if (token != null) {
dataMap['token'] = token;
}
final url = Uri.parse(urlHttp);
final basicAuth = 'Bearer ${authToken ?? token}';
await http
.post(url,
body: dataMap,
headers: (auth)
? {'Authorization': basicAuth, 'X-Number-User': authPhoneNumber}
: null)
.timeout(
const Duration(seconds: 12),
onTimeout: () {
return http.Response('Error', 500);
},
).then((response) {
try {
responseData = json.decode(response.body);
if (responseData.containsKey('token') && phoneNumber!.isNotEmpty) {
authToken = responseData['token'];
authPhoneNumber = phoneNumber;
}
} catch (error) {
print('error ${response.statusCode}');
}
});
try {
return responseData;
} catch (error) {
return kosong;
}
}
}
我尝试验证这一点,但我仍然很困惑。
if(responseData['code'] == 401) {
//handle error
}
有什么想法吗?
最好针对不同的错误处理情况有异常模型。
class UnauthorizedUser implements Exception{}
class TimeoutException implements Exception{}
然后在出现异常时抛出这些异常。
if(responseData['code'] == 401) {
throw UnauthorizedUser ()
}
然后在标语部分处理它们,例如,
rethrow
它们并在存储库层处理它们或在面对它们时执行一些逻辑,例如当未经授权使用时将其重定向到登录页面。
class Api {
static String? authToken;
static String authPhoneNumber = '';
static Future<Map<String, dynamic>> postData(
{String? phoneNumber,
String? token,
bool auth = false,
required String urlHttp}) async {
late Map<String, dynamic> responseData;
late Map<String, dynamic> kosong = {};
Map<String, dynamic> dataMap = {};
if (phoneNumber != null) {
dataMap['phoneNumber'] = phoneNumber;
}
if (token != null) {
dataMap['token'] = token;
}
final url = Uri.parse(urlHttp);
final basicAuth = 'Bearer ${authToken ?? token}';
try {
final response = await http
.post(url,
body: dataMap,
headers: (auth)
? {'Authorization': basicAuth, 'X-Number-User': authPhoneNumber}
: null)
.timeout(
const Duration(seconds: 12),
onTimeout: () {
throw TimeoutException();
},
);
responseData = json.decode(response.body);
if (responseData.containsKey('token') && phoneNumber!.isNotEmpty) {
authToken = responseData['token'];
authPhoneNumber = phoneNumber;
}
return responseData;
} catch (error) {
if(error is UnauthorizedUser ){
// handle unauthorized
}else if (error is TimeoutException ){
// handle time out like retry again
}
return kosong;
}
}
}
最好使用await 和async 关键字而不是链接
Future
。要处理错误,请阅读这篇异步文章。
如果您正在创建一个 flutter 应用程序,最好熟悉应用程序的通用架构,例如this,它非常容易实现。