Flutter Web部署到Firebase Hosting后Firestore Bundle加载失败求助
问题原因
- 类型兼容问题:Flutter Web release构建模式下,
FirebaseStorage的getData()返回的二进制数据类型不是Firebase JS SDK 8.10.0的loadBundle方法可识别的标准Uint8List格式,隐式类型转换出错导致参数异常。 - 流监听逻辑缺陷:
LoadBundleTask的stream.last调用在Web端JS SDK 8.10.0中存在实现bug,release模式下无法正确捕获流结束事件,提前抛出参数错误。 - 资源编码异常:存储在Firebase Storage中的bundle文件若
Content-Type被默认设置为text/plain,托管平台CDN传输时会自动做文本编码转换,破坏bundle的二进制结构,本地调试时无CDN转换逻辑因此正常。
解决方案
1. 强制转换二进制数据格式
拉取到bundle数据后先手动转换为标准Uint8List再传入loadBundle,代码修改如下:
var rawData = await FirebaseStorage.instance.ref('exports/companyBundle.txt').getData(); // 新增强制类型转换逻辑,适配Web release环境 var buffer = Uint8List.fromList(rawData!); LoadBundleTask task = FirebaseFirestore.instance.loadBundle(buffer);
2. 替换流等待逻辑
不要使用stream.last等待加载完成,改用LoadBundleTask自带的future属性:
// 替换掉 await task.stream.last; await task.future;
3. 修正Storage中bundle文件的Content-Type
在Firebase Storage控制台找到exports/companyBundle.txt文件,修改其元数据,将Content-Type设置为application/firestore-bundle,避免传输时被当做文本处理损坏内容。
4. 可选:升级SDK版本
如果上述修改仍未解决问题,将index.html中引入的Firebase JS SDK版本升级到8.x的最新稳定版(≥8.20.0),该版本已修复loadBundle的多个Web端兼容问题。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

