将图片从图库加载到GridView失败

时间:2020-04-24 10:50:12

标签: flutter

我有一个Flutter应用,我想从图库中挑选图像。我不想使用image_picker,因为我想在应用程序中实现图像并在其中选择它。

喜欢instagram:

Instagram Post picture

我使用image_gallery插件尝试了以下操作:

class PickImagesFromGalleryScreen extends StatefulWidget {
  static const routeName = '/pick-images-from-gallery-screen';

  @override
  State<PickImagesFromGalleryScreen> createState() =>
      _PickImagesFromGalleryScreenState();
}

class _PickImagesFromGalleryScreenState
    extends State<PickImagesFromGalleryScreen> {
  List<File> _allImages = [];
  List<File> _selectedImages = [];

  void _imageSelected(int index) {
    if (_selectedImages.contains(_allImages[index])) {
      setState(() {
        _selectedImages.remove(_allImages[index]);
      });
    } else {
      setState(() {
        _selectedImages.add(_allImages[index]);
      });
    }
  }

  void _returnWithImages() {
    Navigator.pop(context, _selectedImages);
  }

  Future<void> _loadImageList() async {
    Map<dynamic, dynamic> allImageTemp;
    allImageTemp = await FlutterGallaryPlugin.getAllImages;

    List tempAllImageURIs = allImageTemp['URIList'] as List;
    List<File> tempAllImageFiles = [];
    tempAllImageURIs.forEach((image) {
      tempAllImageFiles.add(File(image.toString()));
    });

    setState(() {
      _allImages = tempAllImageFiles; // App crashes here
    });
  }

  GestureDetector _buildGridTile(int index) {
    return GestureDetector(
      onTap: () => _imageSelected(index),
      child: Column(
        mainAxisSize: MainAxisSize.max,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          Image.file(
            _allImages[index],
            fit: BoxFit.contain,
          ),
          Text(_selectedImages.contains(_allImages[index])
              ? 'Selected'
              : 'Not selected')
        ],
      ),
    );
  }

  @override
  void initState() {
    super.initState();
    _loadImageList();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: GridView.builder(
        scrollDirection: Axis.vertical,
        gridDelegate:
            SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 3),
        itemCount: _allImages.length,
        itemBuilder: (context, index) => _buildGridTile(index),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _returnWithImages,
      ),
    );
  }
}

从图库中加载图像。当我想用图像重建屏幕时,应用程序崩溃。

日志:

E/        ( 1668): getAllImageList: /storage/2862-17EF/DCIM/Camera/IMG_20200322_095128.jpg
E/        ( 1668): getAllImageList: IMG_20200322_095128.jpg
E/        ( 1668): getAllImageList: 1586286068
E/        ( 1668): getAllImageList: IMG_20200322_095128
E/        ( 1668): getAllImageList: /storage/2862-17EF/DCIM/Camera/IMG_20200318_122356.jpg
E/        ( 1668): getAllImageList: IMG_20200318_122356.jpg
E/        ( 1668): getAllImageList: 1586286069
E/        ( 1668): getAllImageList: IMG_20200318_122356
E/        ( 1668): getAllImageList: /storage/2862-17EF/DCIM/Camera/IMG_20200322_095134.jpg
... // a lot of images
E/        ( 1668): getAllImageList: IMG-20200423-WA0003.jpg
E/        ( 1668): getAllImageList: 1587648989
E/        ( 1668): getAllImageList: IMG-20200423-WA0003
E/        ( 1668): getAllImageList: /storage/emulated/0/DCIM/Camera/IMG_20200423_212507.jpg
E/        ( 1668): getAllImageList: IMG_20200423_212507.jpg
E/        ( 1668): getAllImageList: 1587669908
E/        ( 1668): getAllImageList: IMG_20200423_212507
Lost connection to device.
Exited (sigterm)

是因为图像过多(超过900张)吗?我不知道为什么应用程序崩溃。我使用GridView.builder构造函数,因此该应用程序不会一次渲染它们。

0 个答案:

没有答案