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
相关产品推荐
相关产品推荐

