如何在颤动中显示来自api响应的png图像?

Posted

技术标签:

【中文标题】如何在颤动中显示来自api响应的png图像?【英文标题】:How to display a png image from api response in flutter? 【发布时间】:2021-12-18 09:26:43 【问题描述】:

我得到一个 PNG 图像(不是 URI)作为对我的 api 请求的响应,如下所示:

Future PostToGetPostImages(String pic_id,String pic_type) async 
    try 
      var parms = 
        'code': pic_type+"_"+pic_id,
      ;

      Response response = await _dio.post(_get_post_image,
          data: parms,
          options: Options(contentType: Headers.formUrlEncodedContentType),
          onSendProgress: (int sent, int total) 
            print('sent : $sent // total : $total');
          , onReceiveProgress: (v, s) 
            print('v : $v // s : $s');
          );

      print('***** Response body Download Profile Images: $response.data **********');
      
      return response.data;
     catch (error, stacktrace) 
      _handleError(error);
      print("Exception occured A: $error stackTrace: $stacktrace");
    
  

这是执行后打印的内容:

I/flutter (12777): ***** Response body Download Profile Images: �PNG

我需要知道如何在颤动中显示此响应(png 图像),我正在使用此代码但它不起作用:

FutureBuilder(
                    future: aptProvider().PostToGetProfileImages("1", "m"),
                    builder: (context, snapshot) 
                      return CircleAvatar(
                          radius: 65.0,
                          backgroundImage: backgroundImage: NetworkImage(snapshot.data
                            .toString()));
                    ),

【问题讨论】:

请分享您的 json 数据示例,之后我可以为您提供更多帮助,因为您使用了不正确的函数格式。你需要使用 mvvm 技术 在这里评论你的网址 【参考方案1】:

也许 png 就像一个 404 的虚拟图像,就像附加图像中的那个一样,所以你必须复制并尝试使用 Image.network 检查它,如果一切正常,你继续使用 image.network

【讨论】:

我不能使用 Image.network 因为 CircleAvatar 需要一个 ImageProvider Widget 尝试使用容器(高度:20,宽度:20,装饰:盒子装饰(图片:装饰图片(网络图片(url)))) 什么都没有改变【参考方案2】:

这里的问题是您没有使用 URL 图片,确认使用以 (.png, jpg, ..etc.) 结尾的 URL 并通过在浏览器中打开它来确认。

然后

使用其中一种方式在您的小部件中显示它

第一

Image.network('URL') 
// ex: Image.network('https://picsum.photos/250?image=9')

第二

Container( height : 100 , width :100 , decoration : Box decoration ( 
  image : Decoration image ( Network image ('URL'), ), 
), ), ),

【讨论】:

API 返回的是图像数据而不是 URL,这是我的问题【参考方案3】:

您似乎将图像作为字节数组,base64 字符串。

这是我解决这个问题的方法。

var base64 = response.split(';base64,')[1];
base64 = base64.replaceFirst('binary data/', '');
Uint8List bytes = base64Decode(base64);

// Image Widget which you can put in anywhere.
Image.memory(bytes, fit: BoxFit.contain)

【讨论】:

我有这个异常,发生异常 A: RangeError (index): Invalid value: Only valid value is 0: 1【参考方案4】:

如果您从响应中获取图像 url,那么您可以使用 Image.network(imageUrl)

如果你获取的是Uint8List形式的imageData,那么你可以使用Image.memory(imageData)

【讨论】:

我试过了,但它说响应是一个字符串

以上是关于如何在颤动中显示来自api响应的png图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何使选项卡和选项卡栏视图在颤动中动态化,以便它能够响应来自 api 的响应?

如何在listview颤动中显示来自firestore的图像数组?

如何在数据来自 API 的颤动中创建下拉列表?

如何在飞镖颤动中转换图像 dpi(每英寸点数)?

如何从标签 api 响应(javascript)中检索 png

如何将图像放在图像中颤动