错误处理http请求会导致抖动

时间:2019-11-18 17:49:29

标签: flutter flutter-layout flutter-dependencies

我正在尝试处理登录时给出的错误,以通过 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 总是是真的。

2 个答案:

答案 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来起作用。