Correction TP 5
Classe Main
import 'package:flutter/[Link]';
import 'package:firebase_core/firebase_core.dart';
import '[Link]';
import '[Link]';
void main() async {
[Link]();
await [Link]();
runApp(const MonApplication());
}
class MonApplication extends StatelessWidget {
const MonApplication({[Link]});
@override
Widget build(BuildContext context) {
return const MaterialApp(
title: 'Fsegs',
Khouloud Boukadi
debugShowCheckedModeBanner: false,
home: pageAccueil(),
);
}
}
class pageAccueil extends StatelessWidget {
const pageAccueil({[Link]});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: [Link],
title: const Text('Faculté FSEGS'),
centerTitle: true,
// leading: IconButton(
// icon: const Icon([Link]),
// onPressed: () {},
),
// actions: [
// IconButton(
// icon: const Icon([Link]),
// onPressed: () {},
// ),
// ],
// ),
body:
//const SingleChildScrollView(
//child:
const Column(children: [
Image(
image: AssetImage('assets/images/[Link]'),
),
SectionTitre(),
SectionTexte(),
SectionIcone(),
SectionService(),
]),
//-- ------Partie Drawer pour le menu -------
//floatingActionButton: FloatingActionButton(
// onPressed: () {
// debugPrint('tu as cliqué dessus');
// },
// backgroundColor: [Link],
// child: Text('click'),
drawer: Drawer(
child: ListView(
padding: [Link],
children: [
const DrawerHeader(
child: Text('Menu de Navigation'),
Khouloud Boukadi
decoration: BoxDecoration(
color: [Link],
),
),
ListTile(
title: Text('Ajouter un enseignant'),
onTap: () {
[Link](context).push(MaterialPageRoute(
builder: (context) => AjoutEnseignantPage(),
));
},
),
ListTile(
title: const Text('Informations des enseignants'),
onTap: () {
[Link](context).push(MaterialPageRoute(
builder: (context) => EnseignantsInfoPage(),
));
},
),
],
),
),
);
}
}
class SectionTitre extends StatelessWidget {
const SectionTitre({[Link]});
@override
Widget build(BuildContext context) {
return Container(
width: [Link],
padding: const [Link](20),
child: const Column(
crossAxisAlignment: [Link],
children: [
Text(
'Bienvenue à la FSEGS',
style: TextStyle(fontSize: 25, fontWeight: FontWeight.w800),
),
Text(
"La Faculté des Sciences Economiques et de Gestion de Sfax",
style: TextStyle(fontSize: 14, fontWeight: FontWeight.w500),
),
],
),
);
}
}
Khouloud Boukadi
class SectionTexte extends StatelessWidget {
const SectionTexte({[Link]});
@override
Widget build(BuildContext context) {
return Container(
padding: const [Link](horizontal: 20),
child: const Text(
"FSEG est un faculté rattachée à l'université de Sfax. Elle a été
créée par le décret du 14 novembre 1975. Elle comporte aujourd'hui plus que
3800 étudiants et 300 enseignants."),
);
}
}
class SectionIcone extends StatelessWidget {
const SectionIcone({[Link]});
@override
Widget build(BuildContext context) {
return Container(
padding: const [Link](bottom: 10),
child: Row(
mainAxisAlignment: [Link],
children: [
Container(
padding: const [Link](20),
child: Column(
children: [
const Icon([Link], color: [Link]),
const SizedBox(height: 5),
Text(
'Tel'.toUpperCase(),
style: const TextStyle(color: [Link]),
)
],
),
),
Container(
padding: const [Link](20),
child: Column(
children: [
const Icon([Link], color: [Link]),
const SizedBox(height: 5),
Text(
'Mail'.toUpperCase(),
style: const TextStyle(color: [Link]),
)
],
),
),
],
Khouloud Boukadi
),
);
}
}
class SectionService extends StatelessWidget {
const SectionService({[Link]});
@override
Widget build(BuildContext context) {
return Container(
padding: const [Link](horizontal: 20),
child: Row(
mainAxisAlignment: [Link],
children: [
ClipRRect(
borderRadius: [Link](8),
child: Image(
image: AssetImage('assets/images/[Link]'),
),
),
ClipRRect(
borderRadius: [Link](8),
child: Image(
image: AssetImage('assets/images/[Link]'),
),
),
],
),
);
}
}
Classe EnseignantsInfoPage
import 'package:flutter/[Link]';
import 'package:cloud_firestore/cloud_firestore.dart';
import '[Link]';
import '[Link]';
// Cette classe représente une page affichant les informations des enseignants
récupérées depuis Firestore.
class EnseignantsInfoPage extends StatelessWidget {
// Instance de Firestore pour accéder à la base de données.
final FirebaseFirestore _firestore = [Link];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Informations des enseignants'),
Khouloud Boukadi
backgroundColor: [Link],
),
body: StreamBuilder<QuerySnapshot>(
// Ces deux instructions sont utilisées pour récupérer et afficher des
données en temps réel depuis une collection Firestore
//.snapshots(): Écoute les modifications de la collection et renvoie
un objet
// Stream qui émet des instantanés de la collection à chaque
modification
//stream:: Assignation du flux de données à utiliser dans le widget.
Ce flux sera écouté en permanence pour détecter les changements
stream: _firestore.collection('enseignants').snapshots(),
builder: (context, snapshot) {
if (![Link]) {
// Affiche un indicateur de chargement tant que les données ne
sont pas disponibles.
return Center(child: CircularProgressIndicator());
}
final enseignants = [Link]!.docs;
if ([Link]) {
// Affiche un message si aucun enseignant n'est trouvé.
return Center(child: Text('Aucun enseignant trouvé.'));
}
// Construit une liste d'éléments à partir des enseignants
récupérés.
return [Link](
itemCount: [Link],
itemBuilder: (context, index) {
final enseignant =
enseignants[index].data() as Map<String, dynamic>;
// Récupère l'ID, le nom, le prénom et la spécialité de
l'enseignant.
final id_enseignant = enseignants[index].id;
final enseignantNom = enseignant['nom'] ?? "";
final enseignantPrenom = enseignant['prenom'] ?? "";
final enseignantSpecialite = enseignant['specialite'] ?? "";
// Affiche les informations de l'enseignant dans une Card.
return Padding(
padding: [Link](16.0),
child: Card(
margin: [Link](16.0),
child: ListTile(
title: Column(
crossAxisAlignment: [Link],
children: [
Text('Nom: $enseignantNom'),
Text('Prénom: $enseignantPrenom'),
Khouloud Boukadi
Text('Spécialité: $enseignantSpecialite'),
],
),
//trailing est une propriété pour spécifier le contenu qui
apparaît du côté droit
trailing: Row(
mainAxisSize: [Link],
children: [
// Bouton de suppression avec la logique de
navigation.
IconButton(
icon: Icon([Link]),
onPressed: () {
[Link](context).push(
MaterialPageRoute(
builder: (context) => SupprimerEnseignantPage(
id_enseignant,
),
),
);
},
),
// Bouton de modification avec la logique de
navigation.
IconButton(
icon: Icon([Link]),
onPressed: () {
_modifierEnseignant(
context, id_enseignant, enseignant);
},
),
],
),
),
),
);
},
);
},
),
);
}
}
// Fonction pour naviguer vers la page de modification d'un enseignant.
void _modifierEnseignant(BuildContext context, String enseignantId,
Map<String, dynamic> enseignantData) {
[Link](context).push(MaterialPageRoute(
builder: (context) => ModifierEnseignantPage(enseignantId,
enseignantData),
));
}
Khouloud Boukadi
AjoutEnseignantPage
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/[Link]';
class AjoutEnseignantPage extends StatefulWidget {
const AjoutEnseignantPage({Key? key}) : super(key: key);
@override
State<AjoutEnseignantPage> createState() => _AjoutEnseignantPageState();
}
class _AjoutEnseignantPageState extends State<AjoutEnseignantPage> {
// // Clé globale pour identifier le formulaire et effectuer des opérations
telles que la validation.
final _formKey = GlobalKey<FormState>();
//Définition des controlleurs de champs (récupérer les valeurs saisies)
final TextEditingController _nomController = TextEditingController();
final TextEditingController _prenomController = TextEditingController();
final TextEditingController _gradeController = TextEditingController();
final TextEditingController _specialiteController = TextEditingController();
final ButtonStyle stylebouton = [Link](
backgroundColor: [Link],
padding: const [Link](10),
textStyle: const TextStyle(fontSize: 18),
shape: const RoundedRectangleBorder(
borderRadius: [Link]([Link](20)),
),
elevation: 75.2,
);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: [Link],
title: const Text("Ajout d'un Enseignant"),
),
body: Padding(
padding: [Link](16.0),
child: Form(
//// Associe la clé du formulaire au formulaire
key: _formKey,
child: Column(
children: [
TextFormField(
controller: _nomController,
decoration: InputDecoration(labelText: 'Nom de
l\'Enseignant'),
Khouloud Boukadi
validator: (value) {
if (value!.isEmpty) {
return 'Veuillez entrer le nom de l\'enseignant';
}
return null;
},
),
TextFormField(
controller: _prenomController,
decoration:
InputDecoration(labelText: 'Prénom de l\'Enseignant'),
validator: (value) {
if (value!.isEmpty) {
return 'Veuillez entrer le prénom de l\'enseignant';
}
return null;
},
),
TextFormField(
controller: _gradeController,
decoration:
InputDecoration(labelText: 'Grade de l\'Enseignant'),
validator: (value) {
if (value!.isEmpty) {
return 'Veuillez entrer le grade de l\'enseignant';
}
return null;
},
),
TextFormField(
controller: _specialiteController,
decoration: InputDecoration(
labelText:
'Spécialité de l\'Enseignant'), // Nouveau champ pour
la spécialité
validator: (value) {
if (value!.isEmpty) {
return 'Veuillez entrer la spécialité de l\'enseignant';
}
return null;
},
),
SizedBox(height: 20),
ElevatedButton(
style: stylebouton,
onPressed: () async {
if (_formKey.currentState!.validate()) {
//fonction asynchrone
await _ajouterEnseignant();
}
},
child: const Text('Ajouter Enseignant'),
Khouloud Boukadi
),
],
),
),
),
);
}
// Fonction asynchrone pour ajouter l'enseignant à Firestore.
Future<void> _ajouterEnseignant() async {
final nom = _nomController.text;
final prenom = _prenomController.text;
final grade = _gradeController.text;
final specialite = _specialiteController.text;
try {
print('Avant ajout enseignant');
await [Link]('enseignants').add({
'nom': nom,
'prenom': prenom,
'grade': grade,
'specialite': specialite,
});
_afficherSuccesDialog();
print('Après ajout enseignant');
} catch (e) {
print('Erreur lors de l\'ajout de l\'enseignant : $e');
}
}
void _afficherSuccesDialog() {
[Link]((_) {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: const Text('Ajout Réussi'),
content: const Text('L\'enseignant a été ajouté avec succès !'),
actions: <Widget>[
TextButton(
child: const Text('OK'),
onPressed: () {
[Link](context).pop();
[Link](context).pop();
},
),
],
);
},
);
});
}
Khouloud Boukadi
@override
void dispose() {
_nomController.dispose();
_prenomController.dispose();
_gradeController.dispose();
_specialiteController.dispose();
[Link]();
}
}
ModifierEnseignantPage
import 'package:flutter/[Link]';
import 'package:cloud_firestore/cloud_firestore.dart';
class ModifierEnseignantPage extends StatefulWidget {
final String enseignantId;
final Map<String, dynamic> enseignantData;
ModifierEnseignantPage([Link], [Link]);
@override
_ModifierRedacteurPageState createState() => _ModifierRedacteurPageState();
}
class _ModifierRedacteurPageState extends State<ModifierEnseignantPage> {
final FirebaseFirestore _firestore = [Link];
final TextEditingController _nomController = TextEditingController();
final TextEditingController _specialiteController = TextEditingController();
@override
void initState() {
[Link]();
//est une expression qui accède à la propriété 'nom' du champ
enseignantData de l'objet widget.
//Dans ce contexte, widget fait référence à l'instance de la classe
//ModifierEnseignantPage actuelle, et enseignantData est un paramètre
passé à la classe lors de sa création.
_nomController.text = [Link]['nom'];
_specialiteController.text = [Link]['specialite'];
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: [Link],
title: Text('Modifier enseignant'),
Khouloud Boukadi
),
body: Padding(
padding: const [Link](16.0),
child: Column(
children: [
TextFormField(
controller: _nomController,
decoration: InputDecoration(labelText: 'Nom enseignant'),
),
TextFormField(
controller: _specialiteController,
decoration: InputDecoration(labelText: 'Spécialité enseignant'),
),
ElevatedButton(
onPressed: () {
// Enregistrer les modifications dans Firestore
final nouveauNom = _nomController.text;
final nouvelleSpecialite = _specialiteController.text;
final modifications = {
'nom': nouveauNom,
'specialite': nouvelleSpecialite,
};
_firestore
.collection('enseignants')
.doc([Link])
.update(modifications);
// Afficher une boîte de dialogue pour confirmer la
modification
showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text('Modification réussie'),
content: Text(
'Les informations enseignant ont été mises à jour.'),
actions: [
TextButton(
onPressed: () {
[Link](context).pop();
[Link](context)
.pop(); // Retourner à la page précédente
},
child: Text('OK'),
),
],
),
);
},
child: Text('Enregistrer les modifications'),
),
Khouloud Boukadi
],
),
),
);
}
}
SupprimerEnseignantPage
import 'package:flutter/[Link]';
import 'package:cloud_firestore/cloud_firestore.dart';
class SupprimerEnseignantPage extends StatelessWidget {
final FirebaseFirestore _firestore = [Link];
final String id_enseignant;
SupprimerEnseignantPage(this.id_enseignant);
final ButtonStyle stylebouton = [Link](
backgroundColor: [Link],
//Une marge intérieure
padding: const [Link](10),
textStyle: const TextStyle(fontSize: 18),
shape: const RoundedRectangleBorder(
borderRadius: [Link]([Link](20))),
elevation: 75.2);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: [Link],
title: Text('Supprimer enseignant'),
),
body: Padding(
padding: const [Link](16.0),
child: Column(
mainAxisAlignment: [Link],
crossAxisAlignment: [Link],
children: [
Text(
'Êtes-vous sûr de vouloir supprimer cet enseignant ?',
style: TextStyle(fontSize: 18),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () async {
// Supprimer le rédacteur de Firestore
await _firestore
.collection('enseignants')
.doc(id_enseignant)
.delete();
Khouloud Boukadi
// Afficher une boîte de dialogue pour confirmer la
suppression
showDialog(
context: context,
builder: (context) => AlertDialog(
title: Text('Suppression réussie'),
content: Text('Enseignant a été supprimé avec succès.'),
actions: [
TextButton(
onPressed: () {
[Link](context)
.pop(); // Fermer la boîte de dialogue
[Link](context)
.pop(); // Retourner à la page précédente
},
child: Text('OK'),
),
],
),
);
},
child: Text('Supprimer enseignant'),
style: stylebouton, // Appliquez le style défini ici
)
],
),
),
);
}
}
Khouloud Boukadi