我正在尝试处理登录时给出的错误,以通过 http请求检查用户名和密码是否正确,问题是即使我处理了该错误,它仍然会进入欢迎状态屏幕,因为我的检查方法始终以true结束,因为我错误地处理了信息。我希望用户能够看到错误,但是我的代码仅向我显示异常。 https://dart.dev/guides/libraries/futures-error-handling我看过这里,但由于我的具体情况,我没有找到答案。
prefix0.Error err = prefix0.Error();
Future<bool> check(User user) async {
final userResponse = await ApiClient.signIn(user).catchError((error) {
//TODO: handle errors
err.message = jsonDecode(error.toString())["message"];
throw("some arbitrary error");
});
// TODO: Guardar el token en sharedpreferences y verificar si se logro
return true;
}
我真的只是想向用户展示他的错误是什么而不是我自己(这意味着抛出将不起作用,因为它只会停止代码,而将其取出只会使 return true 总是是真的。
答案 0 :(得分:2)
您不应在最后一行返回该值。仅当Future以一个值完成时才应返回true,即在.then()回调中返回tru,如下所示:
Future<bool> check(User user) async {
final userResponse = await ApiClient.signIn(user)
.then((value){
// TODO: handle value
return true;
})
.catchError((error) {
//TODO: handle errors
err.message = jsonDecode(error.toString())["message"];
throw("some arbitrary error");
});
return false;
}
答案 1 :(得分:0)
有两种方法可以解决此问题。首先,让异常冒泡到您正在调用网络方法的屏幕代码中的位置。用try/catch
包围该位置以捕获异常并在那里进行处理:
// Network Class
Future check(User user) async {
final userResponse = await ApiClient.signIn(user);
// TODO: Guardar el token en sharedpreferences y verificar si se logro
return userResponse;
}
// Screen Class
void someMethod() async {
...
try {
final userResponse = Network.check(userData);
// TODO: Handle the user response
} catch (e) {
String errorMessage = e.toString();
// TODO: Do something with the error message, such as show a snackbar:
Scaffold.of(context).showSnackbar(Snackbar(
content: Text(errorMessage),
));
}
}
另一种方法是拥有一个UserResponse
类,该类包含响应数据,并在响应不成功时具有错误状态。屏幕代码然后可以检测到此状态并做出适当的响应:
// Network Class
Future<UserResponse> check(User user) async {
final userResponse = await ApiClient.signIn(user)
.then((data) => UserResponse.fromNetworkResponse(data))
.catchError((error) => UserResponse.fromError(error));
// TODO: Guardar el token en sharedpreferences y verificar si se logro
return userResponse;
}
// Screen Class
void someMethod() async {
...
final userResponse = Network.check(userData);
if (userResponse.hasError) {
String errorMessage = userResponse.errorMessage;
// TODO: Do something with the error message, such as show a snackbar:
Scaffold.of(context).showSnackbar(Snackbar(
content: Text(errorMessage),
));
} else {
// TODO: Handle the user response
}
}
第二种方法需要一些设置,但它是最灵活的,不需要您依靠try/catch
来起作用。