Form & GlobalKey
Un Form regroupe les champs ; une GlobalKey<FormState> permet de le valider et de le soumettre d'un coup.
final _cle = GlobalKey<FormState>(); Form(key: _cle, child: Column(children: [ /* champs */ ]))
TextFormField & contrôleur
Un TextEditingController lit la saisie ; InputDecoration ajoute label et aide.
final _litres = TextEditingController(); TextFormField( controller: _litres, keyboardType: TextInputType.number, decoration: const InputDecoration(labelText: 'Litres'), )
Valider les champs
Chaque champ a un validator qui renvoie un message d'erreur (ou null si valide). Aligné sur les règles du serveur (chapitre Spring 5).
validator: (v) {
final n = int.tryParse(v ?? '');
if (n == null || n < 500) return 'Minimum 500 L';
return null;
}
Soumettre le formulaire
On valide, puis on envoie à l'API (POST du chapitre 13).
onPressed: () async { if (_cle.currentState!.validate()) { await service.rejoindre(id, Commande( litres: int.parse(_litres.text), commune: ..., adresse: ...)); if (context.mounted) Navigator.pop(context, true); } }
🛢️ Sur le projet Fioul Groupé
Construis le formulaire « rejoindre » : litres (≥ 500), commune, adresse, avec validation. À la soumission, POST vers l'API et retour à l'écran de détail (rafraîchi). Double validation client + serveur (sécurité).
À retenir
Form+GlobalKey<FormState>pour valider/soumettre.TextFormField+TextEditingController+validator.- Valider avant d'envoyer ; règles alignées sur le serveur.