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

Flutter Web端GZipCodec().decode失效,求可行解决方案

Flutter Web 下 GZipCodec.decode 失效的解决方案

问题根源

Web平台上,String.codeUnits返回的是UTF-16编码的16位代码单元;而Android/Windows等原生平台中,字符串默认以Latin1/UTF-8逻辑处理,直接用codeUnits能拿到原始字节。这种平台间的编码处理差异,导致Web端转出来的List<int>与原生端不一致,最终引发GZip解码失败。

修复方案

情况1:压缩数据以Base64编码字符串传递(后端传递二进制数据的常见方式)

直接解码Base64得到原始字节后再做GZip解码:

import 'dart:convert';

// 替换原有代码片段
final gzippedBytes = base64Decode(providerFDC.fdcdata_gzipped);
final ungzipped0 = GZipCodec().decode(gzippedBytes);
String ungzipped = utf8.decode(ungzipped0);
List<dynamic> food = jsonDecode(ungzipped);
foodList = food.map((e) => FoodItem.fromJson(e)).toList();

情况2:压缩数据以Latin1编码字符串传递

通过latin1.encode还原原始字节后再解码:

import 'dart:convert';

// 替换原有代码片段
final gzippedBytes = latin1.encode(providerFDC.fdcdata_gzipped);
final ungzipped0 = GZipCodec().decode(gzippedBytes);
String ungzipped = utf8.decode(ungzipped0);
List<dynamic> food = jsonDecode(ungzipped);
foodList = food.map((e) => FoodItem.fromJson(e)).toList();

关键注意点

  • 禁止直接用String.codeUnits处理二进制数据,不同平台的字符串编码逻辑存在本质差异。
  • 必须明确后端传递数据的编码格式(Base64/Latin1等),确保各平台能统一还原原始字节流。

内容的提问来源于stack exchange,提问作者K.Karamazen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 05:10:37