import 'dart:io'; import 'package:flutter/material.dart'; import 'package:image_picker/image_picker.dart'; /// `ImagePreviewPicker` est un widget permettant à l'utilisateur de choisir une image depuis la galerie ou de prendre une photo. /// Ce widget affiche un aperçu de l'image sélectionnée et gère l'interaction pour choisir une nouvelle image. /// /// Arguments : /// - `onImagePicked`: Un callback qui renvoie le fichier image sélectionné (ou null si aucune image n'est choisie). class ImagePreviewPicker extends StatefulWidget { const ImagePreviewPicker({required this.onImagePicked, super.key}); final void Function(File?) onImagePicked; @override _ImagePreviewPickerState createState() => _ImagePreviewPickerState(); } class _ImagePreviewPickerState extends State { File? _selectedImageFile; /// Méthode pour ouvrir le modal de sélection d'image avec une animation. Future _pickImage() async { // Log : Ouverture du modal de sélection d'image debugPrint('Ouverture du modal de sélection d\'image'); final ImagePicker picker = ImagePicker(); // Affichage du modal de sélection d'image final XFile? pickedFile = await showModalBottomSheet( context: context, builder: (BuildContext context) { return SafeArea( child: Column( mainAxisSize: MainAxisSize.min, children: [ ListTile( leading: const Icon(Icons.camera_alt), title: const Text('Prendre une photo'), onTap: () async { Navigator.pop(context, await picker.pickImage(source: ImageSource.camera)); }, ), ListTile( leading: const Icon(Icons.photo_library), title: const Text('Choisir depuis la galerie'), onTap: () async { Navigator.pop(context, await picker.pickImage(source: ImageSource.gallery)); }, ), ], ), ); }, ); // Si un fichier est sélectionné, mettez à jour l'état avec l'image choisie if (pickedFile != null) { setState(() { _selectedImageFile = File(pickedFile.path); widget.onImagePicked(_selectedImageFile); // Passez l'image au parent // Log : Image sélectionnée debugPrint('Image sélectionnée : ${_selectedImageFile?.path}'); }); } } @override Widget build(BuildContext context) { return GestureDetector( onTap: _pickImage, // Ouvre le modal lors du clic child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ const Text( 'Aperçu de l\'image (16:9)', style: TextStyle(color: Colors.blueGrey), ), const SizedBox(height: 8), AnimatedContainer( duration: const Duration(milliseconds: 300), // Animation douce lors du changement d'image padding: const EdgeInsets.all(8), decoration: BoxDecoration( color: Colors.blueGrey.withOpacity(0.1), // Fond légèrement opaque borderRadius: BorderRadius.circular(12), // Bordures arrondies border: Border.all( color: _selectedImageFile != null ? Colors.blue : Colors.blueGrey, width: 2, // Bordure visible autour de l'image ), ), child: AspectRatio( aspectRatio: 16 / 9, // Maintient l'aspect ratio de l'image child: _selectedImageFile != null ? ClipRRect( borderRadius: BorderRadius.circular(10), child: Image.file( _selectedImageFile!, fit: BoxFit.cover, errorBuilder: (context, error, stackTrace) { return const Center( child: Icon(Icons.error, color: Colors.red), ); }, ), ) : const Center( child: Text( 'Cliquez pour ajouter une image', style: TextStyle(color: Colors.blueGrey), ), ), ), ), ], ), ); } }