Flutter 处理http请求时出错会导致颤振

Flutter 处理http请求时出错会导致颤振,flutter,flutter-layout,flutter-dependencies,Flutter,Flutter Layout,Flutter Dependencies,我试图处理登录时出现的错误,通过http请求检查用户和密码是否正确,问题是,即使我处理了错误,它仍然会进入欢迎屏幕,因为我的检查方法总是以true结束,因为我错误地处理了信息。我希望用户能够看到错误,但我的代码只显示了异常。 我看了看这里,但对于我的具体情况,我没有找到答案 prefix0.Error err = prefix0.Error(); Future<bool> check(User user) async { final userResponse = awai

我试图处理登录时出现的错误,通过http请求检查用户和密码是否正确,问题是,即使我处理了错误,它仍然会进入欢迎屏幕,因为我的检查方法总是以true结束,因为我错误地处理了信息。我希望用户能够看到错误,但我的代码只显示了异常。 我看了看这里,但对于我的具体情况,我没有找到答案

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;
  }
prefix0.Error Error=prefix0.Error();
未来检查(用户)异步{
final userResponse=await ApiClient.sign(用户).catchError((错误){
//TODO:处理错误
err.message=jsonDecode(error.toString())[“message”];
抛出(“一些任意错误”);
});
//TODO:Guardar el token en SharedReferences y Verifica si se logro
返回true;
}

我真的只是想向用户展示他的错误,而不是我自己(这意味着throw将不起作用,因为它只是停止代码,取出它只会使返回true始终为true。

您不应该在最后一行返回值。只有当Future完成时,您才应该返回true,返回值为return tru in.then(),如下所示:

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;
}
未来检查(用户)异步{
最终用户响应=等待ApiClient.sign(用户)
.然后((值){
//TODO:句柄值
返回true;
})
.catchError((错误){
//TODO:处理错误
err.message=jsonDecode(error.toString())[“message”];
抛出(“一些任意错误”);
});
返回false;
}

您不应返回最后一行的值。只有当Future使用值(即返回tru in.then()回调)完成时,才应返回true,如下所示:

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;
}
未来检查(用户)异步{
最终用户响应=等待ApiClient.sign(用户)
.然后((值){
//TODO:句柄值
返回true;
})
.catchError((错误){
//TODO:处理错误
err.message=jsonDecode(error.toString())[“message”];
抛出(“一些任意错误”);
});
返回false;
}

有两种处理方法。首先,让异常冒泡到屏幕代码中调用网络方法的位置。用
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
  }
}
//网络类
未来检查(用户)异步{
最终用户响应=等待ApiClient.sign(用户)
.然后((数据)=>UserResponse.fromNetworkResponse(数据))
.catchError((error)=>UserResponse.fromError(error));
//TODO:Guardar el token en SharedReferences y Verifica si se logro
返回userResponse;
}
//屏幕类
void someMethod()异步{
...
最终用户响应=Network.check(userData);
if(userResponse.hasError){
字符串errorMessage=userResponse.errorMessage;
//TODO:对错误消息执行某些操作,例如显示snackbar:
Scaffold.of(上下文).showSnackbar(Snackbar(
内容:文本(错误消息),
));
}否则{
//TODO:处理用户响应
}
}

第二种方法需要一点设置,但它是最灵活的,不需要依靠
try/catch
来运行。

有两种方法来处理这个问题。首先,让异常冒泡到屏幕代码中调用网络方法的位置。用
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
  }
}
//网络类
未来检查(用户)异步{
最终用户响应=等待ApiClient.sign(用户)
.然后((数据)=>UserResponse.fromNetworkResponse(数据))
.catchError((error)=>UserResponse.fromError(error));
//TODO:Guardar el token en SharedReferences y Verifica si se logro
返回userResponse;
}
//屏幕类
void someMethod()异步{
...
最终用户响应=Network.check(userData);
if(userResponse.hasError){
字符串errorMessage=userResponse.errorMessage;
//TODO:对错误消息执行某些操作,例如显示snackbar:
Scaffold.of(上下文).showSnackbar(Snackbar(
内容:文本(错误消息),
));
}否则{
//TODO:处理用户响应
}
}

第二种方法需要一点设置,但它是最灵活的,不需要依赖
try/catch
来运行。

此代码是在屏幕小部件/状态的类中还是在其他类中?此代码是在屏幕小部件/状态的类中还是在其他类中?您有
check
方法硬编码返回false。这不会按照OP希望的方式工作。它也不会将任何错误详细信息返回到调用
检查
的代码中,因此屏幕不会得到比OP已经得到的更多的信息。您将
检查
方法硬编码返回false。这不起作用OP希望它的工作方式。它也不会将任何错误详细信息返回到调用
check
的代码中,因此屏幕不会得到比OP已经得到的更多的信息。