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

问题描述 投票:0回答:2

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

以下是我的代码,用于将多个图像上传到Firebase存储

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存储器的方式没有任何错误或错误。主要问题是显示那些用户选择的图像。

假设用户选择了多个图像。现在,我想预览这些图像,然后用户才能将其上传到Firebase。因此,我在GridView.Builder中显示这些图像,这会导致内存不足问题。我在Flutter仓库中发现了有关此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上进行了测试,导致了同样的问题。

我在我的项目中使用https://pub.dev/packages/multi_image_picker,以便用户可以选择多个图像。以下是我的代码,可将多个图像上传到Firebase Storage StorageReference ...

flutter dart firebase-storage
2个回答
0
投票

我个人不知道为什么您的代码不起作用,但是我之前已经实现了此功能,这就是我的代码的样子。请尝试根据您的目的使用和编辑我的代码。


0
投票

因此,问题的真正根本原因是,将小部件包装在流生成器中,这导致即使数据未更改,它也不断地反复重建它]

© www.soinside.com 2019 - 2024. All rights reserved.