У меня есть приложение для флаттера, и я хочу выбрать изображения из галереи. Я не хочу использовать image_picker , потому что я хочу внедрить изображения в приложение и выбрать его там.
Как в Instagram:
Я попробовал следующее с плагином 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, поэтому приложение не отображает их сразу.