我在项目中使用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 files
和GL_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 ...
我个人不知道为什么您的代码不起作用,但是我之前已经实现了此功能,这就是我的代码的样子。请尝试根据您的目的使用和编辑我的代码。
因此,问题的真正根本原因是,将小部件包装在流生成器中,这导致即使数据未更改,它也不断地反复重建它]