Недостаточно памяти при загрузке изображений в Gridview Flutter

Я пытаюсь создать GridView во Flutter, который состоит из 20-30 изображений с высоким разрешением, но сталкивается с проблемами памяти (при использовании памяти в профилировщике Android Studio до 1,2 г, что в конечном итоге приводит к затемнению).

Вот как я строю GridView,

@override
Widget build(BuildContext context) {
  return Scaffold(
    body: new SafeArea(
        child: new Center(
          child: _imageSectionFutureBuilder(), // <-- The core component
        )),
  );
}

Widget _imageSectionFutureBuilder() {
    // Pseudocode is as follows,
    return new FutureBuilder(
        future: _FetchImageLocationsFromDb().then(results) {
        // Some data pre-processing
        preProcessData(results);
    },
    builder: (context, snapshot){
        if (snapshot.hasData) {
        // Here's where I'm building the GridView Builder.
        return new GridView.builder(
          gridDelegate: new SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2),
          itemBuilder: (BuildContext context, int index) {
            return _getCurrentItem(snapshot.data[index]); // <-- This function loads a particular image
            }
          );
        } else {
        // Display a different widget saying no data is available.
          return _showNoDataWidget();
        }
      },
    );
  }

  Widget _getCurrentItem(String imagePath) {
    if (FileSystemEntity.typeSync(imagePath) != FileSystemEntityType.notFound) {
      File imageFile = new File(imagePath);
      return new Container(
          child: new Image.file(
            imageFile,
            fit: BoxFit.cover
          ) // <-- Box fitting to ensure specific height images to the gridview
      );
    }
  }

Помимо этой реализации, я также реализовал механизм разбиения на страницы для загрузки всего около 10 изображений одновременно, а затем реализовал то же самое с помощью ListView.builder(), даже пытался использовать GridView.count с cacheExtent set to 0 а также addAutomaticKeepAlives to falseи во всех случаях проблема с памятью все еще сохраняется.

В любом случае я могу решить эту проблему? Благодарю вас.

1 ответ

Возникает ошибка «Недостаточно памяти», поскольку отображаемые и кэшируемые изображения представляют собой полноразмерные изображения, размер которых, скорее всего, изменен (по-прежнему занимает часть памяти). Я предлагаю создать миниатюры для изображений, которые вы будете отображать, чтобы сэкономить память. В этом посте есть много полезных ответов , которые вы можете выбрать.

У вас есть конкретный вариант использования, когда вам нужно создать сетку, которая отображает изображения из локального хранилища с нуля? Если нет, вы можете рассмотреть возможность использования плагина image_picker , если вы просто будете использовать эту функцию в качестве средства выбора изображений.

Другие вопросы по тегам