如果服务器无法访问颤动,如何显示错误

Posted

技术标签:

【中文标题】如果服务器无法访问颤动,如何显示错误【英文标题】: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方法的代码 【参考方案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 状态码的服务器响应码。

【讨论】:

以上是关于如果服务器无法访问颤动,如何显示错误的主要内容,如果未能解决你的问题,请参考以下文章

无法在颤动中访问android 11版设备上的隐藏文件夹

操作系统错误:访问被拒绝。 , errno = 5 颤动

糟糕,网页无法访问,错误代码显示的是400是啥意思?

无法显示网页,错误代码:500 这是怎么回事?应该怎么办?

电脑加域失败显示:5

无法在颤动中模拟单例类