【问题标题】:How to show error if server is unreachable flutter如果服务器无法访问颤动,如何显示错误
【发布时间】:2021-03-30 07:16:52
【问题描述】:

我还是很陌生。我有一个要执行的网络调用。但在此之前,我需要检查设备是否具有互联网连接以及服务器是否是 api 服务器是否可以访问。我已设法检查互联网连接是否可用,但无法显示何时无法访问服务器

这是我到目前为止所做的:

 login(username, password) async {
  final String url = "http://10.0.2.2:8080/api/auth/signin"; // iOS
  var responseJson;
  try {
    final response= await http.post(
      url,
      headers: <String, String>{
        'Content-Type': 'application/json; charset=UTF-8',
      },
      body: jsonEncode(<String, String>{
        'username': username,
        'password': password,
      }),
    );
    responseJson = _response(response);
  } on SocketException {
    throw FetchDataException('No Internet connection');
  }
  print(responseJson);
  SharedPreferences prefs = await SharedPreferences.getInstance();
  var parse = jsonDecode(responseJson.body);

  await prefs.setString('username', parse["username"]);
  await prefs.setString('message', parse["message"]);
  await prefs.setString('accessToken', parse["accessToken"]);

  return responseJson;
}
  dynamic _response(http.Response response) {
    switch (response.statusCode) {
      case 200:
        var responseJson = json.decode(response.body.toString());
        print(responseJson);
        return responseJson;
      case 400:
        throw BadRequestException(response.body.toString());
      case 401:

      case 403:
        throw UnauthorisedException(response.body.toString());
      case 500:
        throw FetchDataException(
            'Error occured while Communication with Server with StatusCode : ${response
                .statusCode}');
      default:
        throw FetchDataException(
            'Error occured while Communication with Server with StatusCode : ${response
                .statusCode}');
    }
  }

我的登录按钮功能

 RoundedButton(
                    text: "LOGIN",
                    press: () async {
                      if (_formKey.currentState.validate()) {
                        progressDialog.show();
                        await login(
                          username,
                          password,
                        );
                        SharedPreferences prefs =
                            await SharedPreferences.getInstance();
                        String token = prefs.getString("accessToken");
                        print(token);

                        if (token == null) {
                          progressDialog.hide();
                          showAlertsDialog(context);
                        } else {
                          showAlertzDialog(context);
                        }
                      }
                    },
                  )

每当我切换服务器并单击登录时,应用程序都会卡在显示登录的进度条。如何显示与服务器没有连接的警报?

【问题讨论】:

  • 如果服务器出现问题而不是您的 http 响应状态码应该与 500 相关,因此对于状态码 500 会抛出错误消息。
  • 嗨@SaifulIslam 如何将错误映射到警报对话框?
  • 显示你调用requestGET方法的代码

标签: flutter dart


【解决方案1】:

这是您管理 API 调用的方式。

Future<dynamic> requestGET({String url}) async {
try {
  final response = await http.get(Uri.parse(url));
  switch (response.statusCode) {
    case 200:
    case 201:
      final result = jsonDecode(response.body);
      final jsonResponse = {'success': true, 'response': result};
      return jsonResponse;
    case 400:
      final result = jsonDecode(response.body);
      final jsonResponse = {'success': false, 'response': result};
      return jsonResponse;
    case 401:
      final jsonResponse = {
        'success': false,
        'response': ConstantUtil.UNAUTHORIZED
      };
      return jsonResponse;
    case 500:
    case 501:
    case 502:
      final jsonResponse = {
        'success': false,
        'response': ConstantUtil.SOMETHING_WRONG
      };
      return jsonResponse;
    default:
      final jsonResponse = {
        'success': false,
        'response': ConstantUtil.SOMETHING_WRONG
      };
      return jsonResponse;
  }
} on SocketException {
  final jsonResponse = {
    'success': false,
    'response': ConstantUtil.NO_INTERNET
  };
  return jsonResponse;
} on FormatException {
  final jsonResponse = {
    'success': false,
    'response': ConstantUtil.BAD_RESPONSE
  };
  return jsonResponse;
} on HttpException {
  final jsonResponse = {
    'success': false,
    'response': ConstantUtil.SOMETHING_WRONG  //Server not responding
  };
  return jsonResponse;
 }
}

调用这个函数并使用响应我在statefulWidget的init方法中调用它。

    @override
    void initState() {
    // TODO: implement initState
    super.initState();

    final result = await requestGET('google.com');
    if (result['success'] == false) {
      // show the dialog
      showDialog(
        context: context,
        builder: (BuildContext context) {
          return AlertDialog(
            title: Text("Error"),
            content: Text(result['response']),
            actions: [
              FlatButton(
                child: Text("OK"),
                onPressed: () {
                  Navigator.pop(context);
                },
              ),
            ],
          );
          ;
        },
      );
    }
  }

【讨论】:

  • 谢谢@Sandeep,如何将消息映射到alerdialog?
  • @blackbird 请投票,当任何答案对您有用时。谢谢
【解决方案2】:

我认为您可以使用此链接http status code的http代码请求来检查api调用的响应代码

您可以像这样检查来自 json 的响应:

Future<String> checkServerResponse() await 
{
 http.Response response =
    await http.get('server_link'):
print(response.statusCode);

}

现在你可以看到基于 http 状态码的服务器响应码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 2018-10-14
    • 2015-02-18
    • 2014-07-07
    • 1970-01-01
    • 2022-08-20
    相关资源
    最近更新 更多