接收数据时连接关闭(通过 NetworkImage 进行图像)从本地主机检索数据时抖动

问题描述 投票:0回答:3

从网络

http://10.0.2.2:8000
本地主机检索图像文件时,出现以下错误:
Connection closed while receiving data.

从 URL 调用数据(仅限图像)时出现错误。
请注意,我使用的是本地服务器。
我正在尝试将图像放入

Image.network()
,这是图像代码。

Image.network(urllink)

相同的 URL 在本地主机浏览器和邮递员中也可以正常工作。
我正在尝试检索装饰框小部件中的图像。
当我在网络图像函数中粘贴直接 url 时,相同的 url 和图像可以工作,但当我尝试通过 api 获取照片名时发生错误。 我得到的 photoname 和 API 工作正常。没有任何问题。

 child: FutureBuilder<MatrimonyProfileData>(
                  future: futureMData,
                  builder: (context, snapshot) {
                    if (snapshot.hasData) {
                      // String matrimonyUrl = '/$matrimonyprofileUrl';
                      String photoName = snapshot.data!.matrimonies.photo;

                      print(photoName);
                      //var fullUrl = _url + apiUrl

                      var url;
                      // urllink = 'http://10.0.2.2:8000/matrimony/profile.jpg';

                      **url = (webLink + matrimony + photoName);
                      print(url);
                      String urllink = Url;**
                      return Column(
                        children: [
                          Container(
                            color: Colors.deepPurpleAccent.shade100,
                            child: Column(
                              children: <Widget>[
                                Container(
                                  margin: const EdgeInsets.all(15.0),
                                  padding: const EdgeInsets.all(3.0),
                                  decoration: BoxDecoration(
                                      border: Border.all(
                                          color: Colors.black, width: 3)),
                                  child: Wrap(
                                    // mainAxisAlignment: MainAxisAlignment.end,
                                    // direction: Axis.vertical,
                                    children: <Widget>[
                                      
                                Container(
                                  height: 300,
                                  width: 400,
                                  //color: Colors.amber,
                                  child: Row(
                                    children: <Widget>[
                                      Container(
                                          height: 300,
                                          width: 170,
                                          //color: Colors.amber,
                                          decoration: BoxDecoration(
                                            image: DecorationImage(
                                                image: **NetworkImage(urllink),**

                                                
                                                fit: BoxFit.fitWidth),
                                            
                                          )),
                                      // SizedBox(
                                      //   width: 20,
                                      // ),

此链接也有同样的问题

https://askandroidquestions.com/2021/07/12/flutter-exception-connection-closed-while-receiving-data/

flutter flutter-layout flutter-dependencies flutter-test flutter-image
3个回答
2
投票

您的 http 请求中可能缺少

Keep-Alive
标头。

尝试将其添加到您的请求标头中:

  "Connection": "Keep-Alive",

0
投票

这有点黑客,但它似乎对我有用。

我有一个运行 Flask 的服务器,我的 flutter 应用程序会回调该服务器以获取数据。我也遇到了同样的错误,但不是专门针对 NetworkImage,但这也应该适用。

我也去寻找答案,不仅添加了

'Connection' : 'keep-alive'
"Keep-Alive": "timeout=20, max=5"
标题,但没有成功。所以这就是我所做的,虽然没有完全解决问题,但它确实显着降低了出现该错误的可能性。

基本上,我有通用的 api 调用函数来处理向服务器发送数据和图像数据,并且我已经将这些函数中实际发出 http 请求的部分包装在 while 循环中,该循环使用跟踪变量来检查是否收到响应或未在指定的尝试次数内完成。

这基本上是要遵循的想法:

// make sure to get your data ready above here, if any
int attempts = 5;
bool gotResponse = false;
String errMsg = "";

while (attempts > 0) {
    attempts = attempts - 1;
    try {
        // this is where you make the http.get or http.post request
        // once you have a response and validate it, then set
        // gotResponse = true
    } catch (err) {
        // set your tracking variables for failure checking here
        gotResponse = false;
        errMsg = err.toString();
    }
}

if (gotResponse == false) {
    throw Exception("$errMsg");
} else {
    throw Exception("Everything's broken");
}

这可能不是一个非常优雅的解决方案,但它为我完成了工作。如果您遇到与我类似的问题(连接有时会连续关闭多次),至少您可以指定重试连接的次数。

希望这有帮助。


0
投票

在我的例子中,当没有

'Accept-Encoding'
标头时,即使有
'Connection': 'Keep-Alive'
,服务器也会关闭连接。后端是用 Laravel 开发的,但我没有太多信息。我添加到标题
'Accept-Encoding': 'gzip, deflate, br'
并且它按预期工作。别问我解释,因为我没有解释

© www.soinside.com 2019 - 2024. All rights reserved.