如何使用 HTTP 请求(Flutter/Dart)检查 Internet 连接?

Posted

技术标签:

【中文标题】如何使用 HTTP 请求(Flutter/Dart)检查 Internet 连接?【英文标题】:How do I check Internet Connectivity using HTTP requests(Flutter/Dart)? 【发布时间】: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);

   

【问题讨论】:

查看这个问题的答案:***.com/questions/49648022/… 【参考方案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 访问,但它可能是 *** 或酒店 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 被抛出的。有没有什么方法可以准确判断是因为没有网络连接?

以上是关于如何使用 HTTP 请求(Flutter/Dart)检查 Internet 连接?的主要内容,如果未能解决你的问题,请参考以下文章

HTTP 请求未在响应中执行 - Flutter/Dart

如何使用 if 语句在“flutter / dart”中发送 https 发布请求

如何在颤振小部件测试中发出 http 请求?

Flutter HTTP 请求使用 xml 正文发送

在 Flutter/Dart 中从 JSON 数组中提取数据

Flutter (Dart 2) 访问 twitter GET api