[英]How to display a png image from api response in flutter?
我收到一个 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
我需要知道如何在 flutter 中显示此响应(png 图像),我正在使用此代码,但它不起作用:
FutureBuilder(
future: aptProvider().PostToGetProfileImages("1", "m"),
builder: (context, snapshot) {
return CircleAvatar(
radius: 65.0,
backgroundImage: backgroundImage: NetworkImage(snapshot.data
.toString()));
}),
也许 png 就像一个像 404 这样的虚拟图像,就像附加图像中的图像一样,所以你必须复制并尝试使用 Image.network 检查它,如果一切正常,你继续使用 image.network
如果您从响应中获取图像 url,则可以使用Image.network(imageUrl)
或者
如果您以 Uint8List 的形式获取 imageData,那么您可以使用Image.memory(imageData)
这里的问题是您没有使用 URL 图像,请确认使用以(.png、jpg、.. 等)结尾的 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'), ),
), ), ),
看起来您将图像作为字节数组,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)
我不确定你是否让它工作,但我想留下这个以供将来参考:
您正在接收原始字节作为响应的一部分; 从那里您将需要使用它们来创建图像。 为此,您有两种选择:
选项 1 通常是您想要的,但如果您需要快速测试,您可以毫无问题地执行选项 2,请记住 memory 是有限的。 两者都有不同的实现,具体取决于您使用的包。
以下是仅使用普通的旧http
选项 2 的简要概述:
// MyRepository.dart
class Repository {
Future<Uint8List?> getImageBytes(<...some params>) async {
final streamResponse = await client.send(<...some req>);
final response = await Response.fromStream(streamResponse);
if (response.statusCode == 200) {
parsedResponse = response.bodyBytes;
}
return null;
}
}
// MyWidget.dart
class MyWidget extends StatelessWidget {
<... some other code>
final Uint8List imageRawBytes;
@override
Widget build(BuildContext context) {
return Image.memory(
imageRawBytes,
);
}
}
这里重要的是您使用原始响应字节而不是使用响应主体(通常是编码的字符串)。 这样,您可以构建File
或将它们保存在 memory 中以供使用。
请分享您的json数据示例,然后我可以帮助您更多地使用不正确的函数格式。 你需要使用 mvvm 技术
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.