You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何展示API请求返回的PNG格式二进制图片数据

解决方案

1. 修改Dio请求代码,指定响应类型为二进制

你当前的请求默认会将响应内容解析为字符串,所以无法得到正确的PNG二进制数据,需要在请求配置中指定响应类型为字节格式,修改后的代码如下:

// 明确返回值为Uint8List,即二进制字节数组
Future<Uint8List?> 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,
            // 新增配置,指定响应为二进制字节
            responseType: ResponseType.bytes
          ),
          onSendProgress: (int sent, int total) {
            print('sent : $sent // total : $total');
          }, onReceiveProgress: (v, s) {
            print('v : $v // s : $s');
          });
      return response.data;
    } catch (error, stacktrace) {
      _handleError(error);
      print("Exception occured A: $error stackTrace: $stacktrace");
      return null;
    }
  }

2. 调整图片加载逻辑,使用MemoryImage加载内存字节

NetworkImage仅用于加载网络URL格式的图片,你拿到的是内存中的PNG二进制数据,需要换成MemoryImage加载,同时补充FutureBuilder的状态判断避免空值异常,修改后的代码如下:

FutureBuilder<Uint8List?>(
  future: aptProvider().PostToGetPostImages("1", "m"),
  builder: (context, snapshot) {
    // 加载中状态,可替换为自定义占位图
    if (snapshot.connectionState == ConnectionState.waiting) {
      return const CircleAvatar(
        radius: 65.0,
        child: CircularProgressIndicator(strokeWidth: 2),
      );
    }
    // 加载成功、有数据的情况
    if (snapshot.hasData && snapshot.data != null) {
      return CircleAvatar(
        radius: 65.0,
        backgroundImage: MemoryImage(snapshot.data!),
      );
    }
    // 加载失败/无数据的情况,可替换为默认头像
    return const CircleAvatar(
      radius: 65.0,
      child: Icon(Icons.person),
    );
  }
)

注意事项

  • 确保接口返回的是纯PNG二进制流,没有包裹JSON等其他格式数据
  • 占位图和错误状态的UI可以根据业务需求自行调整

内容的提问来源于stack exchange,提问作者MEDANIS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 21:39:01