【问题标题】:How do I check Internet Connectivity using HTTP requests(Flutter/Dart)?如何使用 HTTP 请求(Flutter/Dart)检查 Internet 连接?
【发布时间】:2020-07-17 02:01:27
【问题描述】:

这可能是一个菜鸟问题,但是如果用户没有互联网连接或获取数据需要很长时间,我如何让我的响应引发异常?

Future<TransactionModel> getDetailedTransaction(String crypto) async {
//TODO Make it return an error if there is no internet or takes too long!

 http.Response response = await http.get(crypto);

  return parsedJson(response);

   }

【问题讨论】:

标签: android iphone flutter dart


【解决方案1】:

这是我检查互联网连接以检查整个应用程序的互联网连接的方法

我创建了一个名为“connectivity”的通用类,并在应用程序的任何地方使用它来检查连接性。我使用 flutter 的连接包。

我的连接类

 Future<bool> check() async {
  var connectivityResult = await (Connectivity().checkConnectivity());
  if (connectivityResult == ConnectivityResult.mobile) {
    return true;
  } else if (connectivityResult == ConnectivityResult.wifi) {
    return true;
  }
  return false;
}

然后我像这样使用这个类:

 @override
  void initState() {
    super.initState();

    checkInternetConnection().then((internet) {
      if (internet != null && internet) {
        // Internet Present Case
        // do your task;
      } else {
        // No-Internet Case
        showAlertDialog(context);
      }
    });
  }

【讨论】:

    【解决方案2】:

    您不需要使用http自己检查连接,只需使用connectivity

    【讨论】:

    • 感谢您的意见!我正在为这个项目使用 BLoC 设计模式,所以这个解决方案最终与我的项目不兼容。
    • 原发帖人询问如何检查互联网连接,但pub.dev/packages/connectivity中的连接库包页面明确指出“在Android上,这并不能保证连接到互联网。例如,应用程序可能有 wifi 访问,但它可能是 VPN 或酒店 WiFi 无法访问。”。因此,这个答案并不能解决发帖者的问题。
    【解决方案3】:

    你可以使用这个插件https://pub.dev/packages/data_connection_checker

    因此,您可以事先检查您是否有连接,如果没有,则向用户发出没有互联网连接的警报。如果你有互联网连接,那么就继续你的获取部分。

    我将在下面链接一些资源已经完美解释:

    https://www.youtube.com/watch?v=u_Xyqo6lhFE

    这是在进行 http 调用之前要做的所有事情,但是如果在进行 http 调用时互联网中断了,那么您可以使用 @uros 提到的 try catch 块。

    让我知道它是否有效。

    【讨论】:

    • 如果您想检查整个应用程序中的数据连接,该解决方案很好,但我只想在该一种获取方法中检查连接。感谢您的帮助!
    【解决方案4】:

    你应该用 try catch 块包围它,像这样:

    import 'package:http/http.dart' as http;
    
    int timeout = 5;
    try {
      http.Response response = await http.get('someUrl').
          timeout(Duration(seconds: timeout));
      if (response.statusCode == 200) {
        // do something
      } else {
        // handle it
      }
    } on TimeoutException catch (e) {
      print('Timeout Error: $e');
    } on SocketException catch (e) {
      print('Socket Error: $e');
    } on Error catch (e) {
      print('General Error: $e');
    }
    

    如果手机知道没有连接(如 WiFi 和数据连接都关闭),则会立即引发套接字异常。

    在给定的超时后会引发超时异常,例如服务器响应时间过长或用户连接很差等。

    如果响应码不是 = 200,也不要忘记处理这种情况。

    【讨论】:

    • 抱歉让您久等了。非常感谢它完美地工作!
    • @Uros 但手机连接到 wifi 仍然出现套接字异常错误。
    • 没有互联网连接只是SocketException 抛出的原因之一。我的意思是还有一些其他问题是我导致SocketException 被抛出的。有没有什么方法可以准确判断是因为没有网络连接?
    猜你喜欢
    • 2019-07-05
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    • 1970-01-01
    • 2013-12-01
    相关资源
    最近更新 更多