import 'package:flutter/material.dart'; /// `DescriptionField` est un champ de texte utilisé pour saisir une description. /// Ce champ fait partie d'un formulaire et est conçu pour accepter plusieurs lignes de texte. /// Il est doté de validations et d'une logique d'enregistrement personnalisée via `onSaved`. /// /// Ce widget utilise des icônes et un style personnalisé pour correspondre à l'apparence de l'application. /// /// Arguments : /// - `onSaved`: Une fonction callback utilisée pour enregistrer la valeur du champ de texte une fois que le formulaire est soumis. /// ``` class DescriptionField extends StatelessWidget { // Constructeur du widget DescriptionField const DescriptionField({required this.onSaved, super.key}); // Callback utilisé pour enregistrer la valeur de la description final FormFieldSetter onSaved; @override Widget build(BuildContext context) { // Log : Construction du champ DescriptionField debugPrint('Construction du champ DescriptionField'); return TextFormField( // Décoration du champ de texte decoration: InputDecoration( labelText: 'Description', // Texte étiquette affiché à l'utilisateur labelStyle: const TextStyle(color: Colors.blueGrey), // Style de l'étiquette filled: true, // Active le fond coloré fillColor: Colors.blueGrey.withOpacity(0.1), // Couleur de fond plus douce et plus subtile hintStyle: const TextStyle(color: Colors.blueGrey), hintText: 'Entrez un la description ici...', border: const OutlineInputBorder( borderRadius: BorderRadius.all(Radius.circular(12)), // Bordure arrondie améliorée borderSide: BorderSide.none, // Pas de bordure visible ), enabledBorder: const OutlineInputBorder( borderRadius: BorderRadius.all(Radius.circular(12)), borderSide: BorderSide( color: Colors.blueGrey, // Bordure de base en bleu gris width: 2, // Largeur de la bordure ), ), focusedBorder: const OutlineInputBorder( borderRadius: BorderRadius.all(Radius.circular(12)), borderSide: BorderSide( color: Colors.blue, // Bordure bleue lors du focus width: 2, // Épaisseur de la bordure lors du focus ), ), prefixIcon: const Icon(Icons.description, color: Colors.blueGrey), // Icône de description avant le texte ), // Style du texte dans le champ style: const TextStyle(color: Colors.blueGrey, fontSize: 16), // Limite le champ à 3 lignes, avec un retour à la ligne automatique maxLines: 3, // Autres configurations du champ textInputAction: TextInputAction.done, // Permet de soumettre avec la touche "Done" du clavier // Validation du champ : assure que le champ n'est pas vide validator: (value) { // Log : Validation du champ DescriptionField debugPrint('Validation du champ DescriptionField'); if (value == null || value.isEmpty) { return 'Veuillez entrer une description'; // Message d'erreur si la description est vide } return null; // Retourne null si la validation passe }, // Lors de la soumission du formulaire, enregistre la valeur saisie onSaved: (value) { // Log : Sauvegarde de la valeur de la description debugPrint('Valeur de la description sauvegardée : $value'); onSaved(value); // Appel de la fonction onSaved passée en paramètre }, ); } }