Я использую 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();
Но я получаю Cra sh, говоря Too many open files
и GL_OUT_OF_MEMORY
Код работает нормально, когда я выбираю одно или два изображения, но если выбрать от 7 до 8 изображений, я получаю Cra sh
Редактировать 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, который вызывает ту же проблему.