如何处理来自API请求颤振的错误

如何处理来自API请求颤振的错误,api,flutter,dart,Api,Flutter,Dart,我想用一些错误消息处理http请求颤振,并在屏幕上向用户显示它,但我不能这样做。我只是根据建议做的,但对我来说不起作用。请大家帮帮我,这是我调用API的函数 API响应: { "code": 1, "message": "this box is not valid !!", "data": [], "error": [], "status"

我想用一些错误消息处理http请求颤振,并在屏幕上向用户显示它,但我不能这样做。我只是根据建议做的,但对我来说不起作用。请大家帮帮我,这是我调用API的函数

API响应:

{
    "code": 1,
    "message": "this box is not valid !!",
    "data": [],
    "error": [],
    "status": 400
}
这就是功能:

  Future<BoxModel> addBox(String boxName, String boxIdentifiant,
      String adress_circulation, String proprietaire) async {
    SharedPreferences localStorage = await SharedPreferences.getInstance();
    String token = localStorage.getString('access_token');
    await checkInternet();
    Map<String, String> headers = {
      'Content-type': 'application/json',
      'Accept': 'application/json',
      'Authorization': 'Bearer $token'
    };
    Map<String, String> body = {
      'boxName': boxName,
      'boxIdentifiant': boxIdentifiant,
      'adress_circulation': adress_circulation,
      'proprietaire': proprietaire,
    };
    var response = await http.post(Uri.parse(ApiUtil.ADD_BOX),
        headers: headers, body: jsonEncode(body));
    if (response.statusCode == 200) {
      var body = jsonDecode(response.body);
      var data = body['message'];
      BoxModel box = BoxModel.fromJson(body);
      return box;
    } else {
      throw Exception('Failed to add box');
    }
    
  }

void addBox() async {
    if (_formKey.currentState.validate()) {
      String boxName = _boxNameController.text;
      String boxIdentifiant = _boxIdentifiantController.text;
      String adress_circulation = _adress_circulationController.text;
      String proprietaire = _proprietaireController.text;
      BoxModel box = await boxApi.addBox(
          boxName, boxIdentifiant, adress_circulation, proprietaire);
      if (box != null) {
        Navigator.push(
            context, MaterialPageRoute(builder: (context) => BoxSettings()));
      }
      ScaffoldMessenger.of(context).showSnackBar(snackBar);
    }
  }
Future addBox(String-boxName、String-boxIdentification、,
字符串地址(循环,字符串属性)异步{
SharedReferences localStorage=等待SharedReferences.getInstance();
String-token=localStorage.getString('access_-token');
等待检查互联网();
映射头={
“内容类型”:“应用程序/json”,
“接受”:“应用程序/json”,
“授权”:“持票人$token”
};
地图正文={
“boxName”:boxName,
“boxIdentifiant”:boxIdentifiant,
“地址循环”:地址循环,
“proprietaire”:proprietaire,
};
var response=wait http.post(Uri.parse(ApiUtil.ADD_框),
headers:headers,body:jsonEncode(body));
如果(response.statusCode==200){
var body=jsonDecode(response.body);
var data=body['message'];
BoxModel-box=BoxModel.fromJson(body);
返回框;
}否则{
抛出异常(“添加框失败”);
}
}
void addBox()异步{
if(_formKey.currentState.validate()){
字符串boxName=\u boxNameController.text;
字符串boxIdentification=\u boxIdentificationController.text;
字符串地址\循环=\地址\循环控制器.text;
字符串proprietaire=\u proprietaireController.text;
BoxModel box=等待boxApi.addBox(
boxName、BoxIdentification、Address_circulation、proprietaire);
如果(框!=null){
导航器。推(
context,MaterialPageRoute(builder:(context)=>BoxSettings());
}
ScaffoldMessenger.of(上下文)。showSnackBar(snackBar);
}
}

如何在屏幕上显示消息错误?

由于您已经在使用
SnackBar
,您可以更改代码以在
SnackBar
本身中显示错误

您可以将代码更改为

boxApi.addBox(boxName, boxIdentifiant, adress_circulation, proprietaire)
  .then((box) {
    if (box != null)
      Navigator.push(context, MaterialPageRoute(builder: (context) => BoxSettings()));
  }).catchError((error) {
    ScaffoldMessenger.of(context)
      .showSnackBar(SnackBar(content: Text("this box is not valid !!")));
  });

由于您已经在使用
SnackBar
,您可以更改代码以在
SnackBar
本身中显示错误

您可以将代码更改为

boxApi.addBox(boxName, boxIdentifiant, adress_circulation, proprietaire)
  .then((box) {
    if (box != null)
      Navigator.push(context, MaterialPageRoute(builder: (context) => BoxSettings()));
  }).catchError((error) {
    ScaffoldMessenger.of(context)
      .showSnackBar(SnackBar(content: Text("this box is not valid !!")));
  });
改变

改变


您希望在屏幕上的何处显示错误消息?(对于用户)@Nisanth Reddy您想在屏幕上的何处显示错误消息?(供用户使用)@尼桑斯·雷德补充了我的答案。您在
SnackBar(内容:Text(…))
中提供的任何内容都将显示在屏幕上。这对您有用吗?要处理来自
any
api的任何错误,您需要在
Widget
树的根目录下有一个主类,并且只调用它的函数来使用api。这就是
Navigator
api的工作原理,因为
Navigator
是应用程序的根目录。一旦您创建了自己的根小部件,比如
NetworkWidget
,并在该小部件的代码中处理调用API,那么您就可以在单个小部件中编写代码来处理错误并将其显示在屏幕上。这有点复杂,但可以实现。这很难在评论中解释。您需要编写一个完整的类来处理所有情况。这通常是不必要的,因为Flatter已经提供回调,您可以从任何地方轻松调用
ScaffoldMessenger.of(context).showSnackBar
,就像我在回答中所显示的那样。即使是另一个答案也要求你将其存储在state中,然后使用它,这已经使它变得不必要的复杂。非常感谢你的帮助:)谢谢你接受这个答案。如果你真的想要那种根控件,问另一个问题。我会试着写,但这并不容易。会有很多事情要处理。太头痛了。更新了我的答案。您在
SnackBar(内容:Text(…))
中提供的任何内容都将显示在屏幕上。这对您有用吗?要处理来自
any
api的任何错误,您需要在
Widget
树的根目录下有一个主类,并且只调用它的函数来使用api。这就是
Navigator
api的工作原理,因为
Navigator
是应用程序的根目录。一旦您创建了自己的根小部件,比如
NetworkWidget
,并在该小部件的代码中处理调用API,那么您就可以在单个小部件中编写代码来处理错误并将其显示在屏幕上。这有点复杂,但可以实现。这很难在评论中解释。您需要编写一个完整的类来处理所有情况。这通常是不必要的,因为Flatter已经提供回调,您可以从任何地方轻松调用
ScaffoldMessenger.of(context).showSnackBar
,就像我在回答中所显示的那样。即使是另一个答案也要求你将其存储在state中,然后使用它,这已经使它变得不必要的复杂。非常感谢你的帮助:)谢谢你接受这个答案。如果你真的想要那种根控件,问另一个问题。我会试着写,但这并不容易。会有很多事情要处理。非常头痛//使错误布尔变量为true,如果为true,则在视图中设置显示错误消息@Saied Islam表示,如果出现错误,则表示变量为布尔变量,使变量为true,而不是false。在小部件中检查它是否为真,如果为真,则显示错误消息,如果不是,则显示小部件的其余部分//使错误布尔变量为真,如果为真,则在视图中设置显示错误消息@Saied Islam表示,如果出现错误,则表示变量为布尔变量,使变量为true,而不是false。在小部件中检查它是否为真,如果为真,则显示错误消息,如果不是,则显示小部件的其余部分
var body = jsonDecode(response.body);
if(body['error'].isNotEmpty || body['status'] != 200) {
    // make error boolean variable true and set in view if true show error message.
} else {
   // make error boolean variable false
   var data = body['message'];
   BoxModel box = BoxModel.fromJson(body);
   return box;
}