我有一个使用Flutter HTTP library的方法,负责调用对服务器的HTTP请求,代码如下:
Future<List<DataModel>> fetchData() async {
try {
var url = Uri.parse('${baseUrlParse}myapipath');
var request = await http.get(url);
var data = jsonDecode(request.body);
return data;
} catch (e) {
print('Catch ${e}');
rethrow;
}
}
此代码运行良好,没有任何问题。
当我没有互联网连接或服务器连接失败时,应用程序会冻结,并出现一个错误文件(* 如果您在VS代码中调试 *),名为http_impl.dart
,错误片段如下所示:
onError: (error) {
// When there is a timeout, there is a race in which the connectionTask
// Future won't be completed with an error before the socketFuture here
// is completed with a TimeoutException by the onTimeout callback above.
// In this case, propagate a SocketException as specified by the
// HttpClient.connectionTimeout docs.
if (error is TimeoutException) {
assert(connectionTimeout != null);
_connecting--;
_socketTasks.remove(task);
task.cancel();
throw SocketException(
"HTTP connection timed out after $connectionTimeout, "
"host: $host, port: $port");
}
_socketTasks.remove(task);
_checkPending();
throw error;
});
我尝试过从this source和this实现,但是当我发出请求但没有连接时,仍然会出现此错误。
如何处理这个问题?
我想要的是,如果HTTP有问题,或者没有连接,或者无法联系服务器,那么我可以发出通知。
我的代码有问题吗?请帮助,谢谢
2条答案
按热度按时间utugiqy61#
在Flutter中,如果您遇到HTTP连接超时崩溃,您可以尝试以下几种方法来解决该问题:
增加超时持续时间:你可以增加应用在超时前等待连接的持续时间。这可以通过将
http.Client
对象的connectTimeout
属性设置为更高的值来完成。重试连接:您还可以在代码中实现重试机制,如果连接超时,应用将自动重试连接。
检查您的互联网连接:请确保运行应用的设备具有稳定的Internet连接。如果连接不佳,则应用在尝试连接到服务器时可能会超时。
检查服务器的连接:确保您的服务器已启动并正在运行,并且可以处理传入的请求。
捕获并处理异常:您还可以捕获异常并向用户显示消息,让他们知道连接已超时并要求他们检查其Internet连接。
使用软件包:有一些软件包可以处理这个问题,如
dio
软件包,它有一个内置的机制来处理超时和重试。请务必注意,最适合您的应用的解决方案取决于应用的特定要求以及连接超时的原因。
mutmk8jj2#
1.你在你的代码中抛出异常,你需要在你调用这个方法的地方捕捉异常,就像这样。
try {等待获取数据();}捕获(e){ //应做事项:处理异常}
1.您可以通过https://superuser.com/a/1609472的方式停止VS代码捕获未处理的异常