Загрузка нескольких изображений приводит к тому, что приложение обрабатывает sh, говоря слишком много открытых файлов - PullRequest
2 голосов
/ 20 февраля 2020

Я использую 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, который вызывает ту же проблему.

1 Ответ

1 голос
/ 24 февраля 2020

Таким образом, настоящая root причина проблемы заключалась в том, что виджет был обернут в построитель потоков, что заставляло его продолжать перестраивать его снова и снова, даже если данные не изменились

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...