0% ont trouvé ce document utile (0 vote)
23 vues14 pages

Utilisation de WidgetsBinding dans Flutter

Le document présente une application Flutter pour gérer les enseignants d'une faculté, intégrant Firebase pour le stockage des données. Il inclut des pages pour ajouter, modifier et afficher les informations des enseignants, ainsi qu'une interface utilisateur avec un menu de navigation. Les sections de l'application sont bien structurées, avec des éléments tels que des formulaires, des listes et des dialogues de confirmation.

Transféré par

Jberi Amal
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
23 vues14 pages

Utilisation de WidgetsBinding dans Flutter

Le document présente une application Flutter pour gérer les enseignants d'une faculté, intégrant Firebase pour le stockage des données. Il inclut des pages pour ajouter, modifier et afficher les informations des enseignants, ainsi qu'une interface utilisateur avec un menu de navigation. Les sections de l'application sont bien structurées, avec des éléments tels que des formulaires, des listes et des dialogues de confirmation.

Transféré par

Jberi Amal
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

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

Vous aimerez peut-être aussi