多图像上传导致应用程序崩溃,称打开的文件太多



我在项目中使用https://pub.dev/packages/multi_image_picker,以便用户可以选择多个图像。

以下是我将多个图像上传到Firebase Storage 的代码

StorageReference _storageReference = FirebaseStorage.instance
.ref();
await Future.wait(userSelectImages.map((Asset asset) async {
ByteData byteData = await asset.getByteData(quality: 50);
List<int> imageData = byteData.buffer.asUint8List();

StorageUploadTask _uploadTask =
_storageReference.child("$HEALTH_LOG/${asset.name}").putData(imageData);
final StreamSubscription<StorageTaskEvent> _streamSubscription =
_uploadTask.events.listen((event) {
double percent = event != null
? event.snapshot.bytesTransferred /
event.snapshot.totalByteCount
: 0;
});

uploadUrls
.add(await (await _uploadTask.onComplete).ref.getDownloadURL());
await _streamSubscription.cancel();

但我收到一个崩溃,说Too many open filesGL_OUT_OF_MEMORY

当我选择一个或两个图像时,代码运行良好,但如果选择7到8个图像,我会得到崩溃的

编辑2好吧,经过更多的调试,我了解了真正的问题。我将图像上传到firebase存储器的方式没有任何错误或bug。主要问题是显示那些用户选择的图像。

假设用户拾取多个图像。现在我想在用户上传到firebase之前预览这些图像。所以我在GridView.Builder中显示这些图像,这导致了内存不足的问题。我在Flutter repo上发现了一个关于此的错误https://github.com/flutter/flutter/issues/21571

因此,我在GridView中显示图像的代码如下

return GridView.builder(
shrinkWrap: true,
physics: const ScrollPhysics(),
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 3, childAspectRatio: 1),
itemBuilder: (context, index) {
return Padding(
padding: const EdgeInsets.all(8),
child: AssetThumb(
asset: patientHealthLogsBloc.resultAssetValue[index],
width: MediaQuery.of(context).size.width ~/ 3,
height: 100,
quality: 30,
),
);
},
itemCount: patientHealthLogsBloc?.resultAssetValue?.length ?? 0,
);

如果我对上面显示预览的代码发表评论,那么图像会被正确上传,但显示这些图像会导致内存不足错误。我甚至在iPad上进行了测试,这也导致了同样的问题。

因此,问题的真正根本原因是小部件被封装在流生成器中,这导致它不断地重建它,即使数据没有改变

最新更新