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

Flutter调用Odoo 17 API获取图片后Image.network解码失败

问题解决思路

1. 先修正代码语法错误

你代码里的headers写法存在语法问题,不是合法的Map格式,这会导致授权头无法正确携带,请求返回非图片数据从而引发解码失败。修正后的代码:

ClipOval(
  child: Image.network(
    employee.image!,
    fit: BoxFit.cover,
    headers: {'Authorization': 'Bearer $token'}, // 改为正确的Map结构,移除多余逗号
    errorBuilder: (context, error, stackTrace) =>
       const ClipOval(
           child: Icon(Icons.person),
       ),
  ),
)

2. 分场景处理Odoo图片返回格式

如果修正语法后仍无法显示,需要根据Odoo返回的图片类型调整实现方式:

场景A:employee.image是返回二进制图片的API接口

Image.network更适配直接的图片资源URL,对于返回二进制数据的API接口,建议手动发起请求获取字节流后用Image.memory显示:

// 在State组件中实现
Uint8List? _imageBytes;

@override
void initState() {
  super.initState();
  _loadEmployeeImage();
}

Future<void> _loadEmployeeImage() async {
  try {
    final response = await http.get(
      Uri.parse(employee.image!),
      headers: {'Authorization': 'Bearer $token'},
    );
    if (response.statusCode == 200) {
      setState(() => _imageBytes = response.bodyBytes);
    }
  } catch (e) {
    debugPrint('图片加载失败: $e');
  }
}

// 构建UI
ClipOval(
  child: _imageBytes != null
      ? Image.memory(_imageBytes!, fit: BoxFit.cover)
      : const ClipOval(child: Icon(Icons.person)),
)

场景B:employee.image是Base64编码字符串

如果Odoo返回的是Base64格式的图片数据(通常带data:image/xxx;base64,前缀),需要解码后再显示:

import 'dart:convert';

// 解码函数
Uint8List _decodeBase64(String base64Str) {
  final cleanStr = base64Str.replaceFirst(RegExp(r'data:image/[^;]+;base64,'), '');
  return base64Decode(cleanStr);
}

// 显示图片
ClipOval(
  child: Image.memory(
    _decodeBase64(employee.image!),
    fit: BoxFit.cover,
    errorBuilder: (context, error, stackTrace) =>
       const ClipOval(child: Icon(Icons.person)),
  ),
)

3. 额外排查点

  • 确认Flutter中使用的token与Postman完全一致,没有过期或拼写错误
  • 打印请求返回的内容,检查是否是正确的图片二进制数据,还是授权失败的JSON错误信息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 11:06:18