Mobile Learning
Mobile Learning
et Innovation
DÉVELOPPEMENT APPLICATIONS
MOBILE-LEARNING :
Concepts, Évolutions et Enjeux
Définition du e-learning
4
01. Définition et concepts clés
Définition du e-learning
5
01. Définition et concepts clés
2020 …
2010 Incorporation
de l'IA
Début 2000 Expansion des
MOOCs
1990 Mobile
Learning
1960-1970 Avènement des
LMS et d'Internet
Origines du E-
Learning
6
01. Définition et concepts clés
7
01. Définition et concepts clés
▪ Intégration des technologies avancées, telles que l’IA et le Web 4.0, qui
améliorent l’interactivité, l’analyse des performances et la qualité globale
de l’expérience d’apprentissage.
8
01. Définition et concepts clés
0
10
20
30
40
50
60
70
2015-01
2015-04
2015-07
2015-10
2016-01
2016-04
2016-07
2016-10
2017-01
Le terme M-Learning
2017-04
2017-07
2017-10
2018-01
2018-04
Desktop
2018-07
2018-10
2019-01
2019-04
2019-07
2019-10
Mobile
2020-01
2020-04
2020-07
2020-10
2021-01
Tablet
2021-04
2021-07
2021-10
01. Définition et concepts clés
Source : [Link]
2022-01
2022-04
2022-07
2022-10
2023-01
2023-04
2023-07
2023-10
2024-01
10
01. Définition et concepts clés
Le terme M-Learning
11
01. Définition et concepts clés
Le terme M-Learning
12
01. Définition et concepts clés
Le terme M-Learning
13
01. Définition et concepts clés
Le terme M-Learning
Le terme M-Learning
E-Learning
M-Learning
MMS PC
PDA Tablet PC
SMS
laptop
smartphone
15
01. Définition et concepts clés
16
01. Définition et concepts clés
U-Learning vs M-Learning
17
02. Tendances du marché
02. Tendances du marché
Évolution
19
02. Tendances du marché
Évolution
Connectivité en expansion
▪ Le déploiement massif de la 4G, de la 5G et du Wi-Fi mobile améliore
les conditions d’apprentissage en mobilité.
Quelques chiffres
21
02. Tendances du marché
22
02. Tendances du marché
25
03. Enjeux et défis
Le défi institutionnel
26
03. Enjeux et défis
Le défi pédagogique
27
03. Enjeux et défis
28
03. Enjeux et défis
29
03. Enjeux et défis
30
Merci
Master : Ingénierie Techno-pédagogique
et Innovation
DÉVELOPPEMENT APPLICATIONS
MOBILE-LEARNING :
Concevoir une base de données
01. Introduction
3
02. Présentation de la méthode merise
4
02. Présentation de la méthode merise
termes de systèmes.
▪ Les modèles
5
02. Présentation de la méthode merise
L’approche systémique
Approche systémique # Approche analytique
opérationnelle.
7
02. Présentation de la méthode merise
◦ quoi ?
◦ Comment ?
8
02. Présentation de la méthode merise
Les modèles
9
03. Du cahier des charges au MCD
technologie.
10
03. Du cahier des charges au MCD
◦ les propriétés
◦ les entités
◦ les relations
12
04. Les entités, les attributs et le MCD
La notion d'entité
▪ Une entité permet de modéliser un ensemble d'objets concrets ou
abstraits de même nature.
13
04. Les entités, les attributs et le MCD
La notion de propriété
▪ Une propriété est une donnée élémentaire d'une entité
14
04. Les entités, les attributs et le MCD
La notion d'identifiant
modélisation
15
05. Les associations et les cardinalités
La notion de relation
▪ Décrit un lien entre deux ou plusieurs entités.
▪ Elle n'a pas d'identifiant propre, elle est implicitement identifiée par
les identifiants des entités auxquelles elle est liée.
16
05. Les associations et les cardinalités
▪ Une relation est liée à chacune de ses entités par une patte.
Sur la patte, on indique les cardinalités.
17
06. Du MCD au MLD
formalisme des tables logiques est toujours basé sur un MCD donné
MCD
MLD 18
06. Du MCD au MLD
Lettres
majuscules
Entité "Entreprise" Table "Entreprise"
Entreprise ENTREPRISE
No_Etreprise NO_ETREPRISE
Nom NOM
Adresse ADRESSE
Code_postal CODE_POSTAL
Localité LOCALITÉ
MCD MLD 19
06. Du MCD au MLD
Les deux tables sont liées par une flèche nommée selon la relation, qui
pointe de la table à clé étrangère vers la table qui contient la clé primaire
correspondante.
20
MCD MLD
06. Du MCD au MLD
21
06. Du MCD au MLD
CLIENT
CARTE_MEMBRE
NO_CLIENT
NOM Disposer NO_CARTE
PRENOM NO_CLIENT
ADRESSE TYPE_ABONNEMENT
CODE_POSTAL DATE_CREATION 22
MLD
06. Du MCD au MLD
Salarié Entreprise
Directeur technique
No_Salarié 0,1 0,1 No_Etreprise
Nom Nom
Prénom Adresse_siège
MCD
SALARIÉ ENTREPRISE
ENTREPRISE SALARIÉ
NO_SALARIÉ
NO_ENTREPRISE
Directeur technique
NO_ETREPRISE ou NO_SALARIÉ Directeur technique NO_ETREPRISE
NOM
NOM NOM NOM
ADRESSE_SIÈGE
PRÉNOM ADRESSE_SIÈGE PRÉNOM
NO_SALARIÉ
MLD
23
06. Du MCD au MLD
On crée une table supplémentaire ayant comme clé primaire une clé
composée des clés primaires des 2 tables. Lorsque la relation contient
elle-même des propriétés, celles-ci deviennent attributs de la table
supplémentaire. Une propriété de la relation qui est soulignée devra
appartenir à la clé primaire composée de la table supplémentaire.
Commande Article
Porter Code_article
No_commande 1,n 0,n
Quantité libellé
Date
Prix_unitaire
MCD
MLD
CLASSE
NOM_CLASSE
MLD CYCLE
25
06. Du MCD au MLD
posséder
Personne Maison
No_Personne habiter
0,n 1,n Adresse
Adresse
Personne Maison Code_Postal
Nom
Localité
No_Personne Prénom
Adresse
Nom Code_Postal Posséder
Prénom Localité
1,1 1,n
No_Personne
habiter Adresse
MCD MLD
26
06. Du MCD au MLD
Filiale
0,n
mère
DÉTENIR
Société SOCIÉTÉ
NO_SOCIÉTÉ
No_Société Détenir NO_SOCIÉTÉ
Pourcentage_du_capital
NO_SOCIÉTÉ_MÈRE
Nom NOM
POURCENTAGE_DU_CAPITAL
Capital CAPITAL
0,n
filiale MLD
MCD Mère
27
06. Du MCD au MLD
0,1 ÊTRE_MARIÉ
mari
Personne PERSONNE
Nom NO_MATRICULE_ÉPOUSE
Prénom NOM
0,1 PRÉNOM
épouse MLD
MCD
28
06. Du MCD au MLD
Travaux Pratiques
▪ Télécharger MySQL Workbench ➔
[Link]
▪ Télécharger MySQL ou utiliser une installation existante (Xampp, Wamp, etc)
▪ Déposez le fichier .mwb modélisé avec MySQL Workbench, ainsi que le fichier
.sql généré lors de l’opération de Forward Engineering, comme livrables du
premier devoir sur l’espace Classroom.
29
Merci
Master : Ingénierie Techno-pédagogique
et Innovation
DÉVELOPPEMENT APPLICATIONS
MOBILE-LEARNING :
Introduction au langage Dart
3
01. Introduction
Pourquoi utiliser le langage Dart ? reload très rapide.
6. Polyvalence
▪ dans Flutter pour créer des apps Android, iOS, web et desktop
6
01. Introduction
L’environnement Dart
7
01. Introduction
Le Dart SDK
Avantages:
▪ Pas besoin d’installer Dart
▪ Tester directement dans le navigateur
▪ Supporte :
◦ le Dart simple
◦ Flutter (dans le navigateur)
▪ Idéal pour l’apprentissage en classe
▪ Prend en charge l’auto-complétion et les erreurs
9
02. Syntaxe de base
o typage optionnel
o null safety
Les variables
Exemples:
// Bons exemples :
int nombreApprenants = 30;
double prixCours = 99.9;
String nomApprenant = "Ali";
12
02. Syntaxe de base
Les variables
3. Table des types principaux
Type Description
Les variables
4. Déclarer une variable :
4.1. int : nombres entiers
Les variables
4. Déclarer une variable :
4.3. String : texte
Le texte est entre guillemets " " ou ' '.
15
02. Syntaxe de base
Les variables
4. Déclarer une variable :
4.3. String : texte
Concaténation vs Interpolation en Dart
Lorsque tu veux afficher du texte + des variables, Dart te propose deux façons :
➢ Concaténation :
C’est le fait de coller des textes ensemble en utilisant l’opérateur +.
int quiz1 = 5;
int quiz2 = 3;
print("Le score total des deux quiz est ${quiz1 + quiz2}."); 17
02. Syntaxe de base
Les variables
4. Déclarer une variable :
4.4. bool → vrai / faux
if (aTerminéQuiz) {
print("Badge débloqué ");
} else {
print("Pas encore de badge.");
} 18
02. Syntaxe de base
Les variables
5. Conversions de types en Dart
Méthode Utilisation
19
02. Syntaxe de base
Les Opérateurs
Les opérateurs permettent de manipuler des valeurs, comparer des données,
effectuer des calculs, et contrôler le comportement du programme.
20
02. Syntaxe de base
Les Opérateurs
21
02. Syntaxe de base
Les Opérateurs
3. Les opérateurs logiques
Exemple :
= x=5 affecte 5 à x
+= x += 3 x=x+3
-= x -= 2 x=x-2
*= x *= 2 x=x*2
/= x /= 2 x=x/2
23
02. Syntaxe de base
Les Opérateurs
5. Les opérateurs d'incrémentation / décrémentation
Opérateur Signification
24
02. Syntaxe de base
Les Opérateurs
5. Les opérateurs d'incrémentation / décrémentation
void main() {
int x;
// x++
x = 5;
print(x++); // 5 (utilisé puis augmenté)
print(x); // 6
// ++x
x = 5;
print(++x); // 6 (augmenté puis utilisé)
print(x); // 6
// x--
x = 5;
print(x--); // 5 (utilisé puis diminué)
print(x); // 4
// --x
x = 5;
print(--x); // 4 (diminué puis utilisé)
print(x); // 4
} 25
02. Syntaxe de base
Méthodes les plus utilisées avec String en Dart
Méthode Ce qu’elle fait Exemple
length Donne le nombre de caractères. "Hello".length → 5
isEmpty true si la chaîne est vide. "".isEmpty → true
isNotEmpty true si la chaîne n’est pas vide. "Hi".isNotEmpty → true
toUpperCase() Met tout le texte en MAJUSCULES. "hello".toUpperCase() → "HELLO"
toLowerCase() Met tout le texte en minuscules. "BONJOUR".toLowerCase() → "bonjour"
trim() Enlève les espaces au début et à la fin. " hi ".trim() → "hi"
trimLeft() Enlève les espaces au début. " hi".trimLeft() → "hi"
trimRight() Enlève les espaces à la fin. "hi ".trimRight() → "hi"
contains("x") Vérifie si un texte est présent. "Hello".contains("ell") → true
startsWith("x") Vérifie si la chaîne commence par ce texte. "Bonjour".startsWith("Bon") → true
endsWith("x") Vérifie si la chaîne finit par ce texte. "[Link]".endsWith(".png") → true
substring(a, b) Récupère une partie du texte (de a à b exclu). "Bonjour".substring(0, 3) → "Bon"
indexOf("x") Donne la position de la première occurrence. "salut salut".indexOf("lut") → 2
lastIndexOf("x") Position de la dernière occurrence. "salut salut".lastIndexOf("lut") → 8
replaceAll("a", "b") Remplace tout a par b. "ha ha".replaceAll("ha", "hi") → "hi hi"
split("x") Coupe en liste selon un séparateur. "a,b,c".split(",") → ["a","b","c"]
26
02. Syntaxe de base
Les Commentaires en Dart
/*
Ceci est un commentaire sur
le score initial d'un apprenant.
*/
int score = 10; 27
02. Syntaxe de base
Les Commentaires en Dart
Types de commentaires en Dart
▪ Documentation - ///
Tableau récapitulatif
Type Syntaxe Usage Exemple
Commentaire court // noter une idée, expliquer une ligne int age = 20; // l'âge
Documentation /// expliquer une fonction ou classe /// additionne deux nombres
28
03. Collections en Dart : List, Set, Map
Chaque élément d’une List est associé à une position appelée index :
Caractéristiques principales
29
03. Collections en Dart : List, Set, Map
1. List - Liste ordonnée
Opérations courantes sur List
Action Fonction Exemple Résultat
["Pomme","Banane","
Ajouter à la fin add(item) [Link]("Kiwi")
Orange","Kiwi"]
Ajouter plusieurs addAll([...]) [Link](["Mangue","Poire"]) ajoute plusieurs
place "Fraise" en
Insérer à une position insert(index, item) [Link](1, "Fraise")
index 1
Modifier un élément list[index] = valeur fruits[0] = "Ananas" remplace "Pomme"
supprime la 1re
Supprimer par valeur remove(item) [Link]("Banane")
occurrence
supprime l'élément
Supprimer par index removeAt(index) [Link](1)
index 1
Rechercher un élément contains(item) [Link]("Orange") true/false
30
03. Collections en Dart : List, Set, Map
1. List - Liste ordonnée
Exemple
void main() {
// Liste des cours suivis par l'apprenant
List<String> cours = ["Dart", "Flutter", "UI Design"];
// Affichage du premier cours
print(cours[0]); // Dart
// Affichage du nombre total de cours
print("Nombre de cours suivis : ${[Link]}"); // 3
// Ajout d'un nouveau cours
[Link]("Firebase");
print("Cours après ajout : $cours");
// Vérification si un cours spécifique est suivi
// true
print("L'apprenant suit-il 'Flutter' ? ${[Link]("Flutter")}");
}
31
03. Collections en Dart : List, Set, Map
2. Set - Collection sans doublons
Un Set est une collection d’éléments non ordonnée, ce qui signifie que les
éléments n’ont pas de position fixe (pas d’index comme dans une List).
Une caractéristique essentielle d’un Set est qu’il n’accepte pas les doublons
: chaque valeur ne peut apparaître qu’une seule fois dans la collection.
Caractéristiques principales
32
03. Collections en Dart : List, Set, Map
2. Set - Collection sans doublons
Supprimer une
remove(item) [Link](2) supprime 2
valeur
fusionne sans
Union [Link](set2)
doublons
33
03. Collections en Dart : List, Set, Map
2. Set - Collection sans doublons
Exemple
void main() {
Set<String> badges = {"Débutant", "Intermédiaire"};
34
03. Collections en Dart : List, Set, Map
Une Map est une collection qui stocke les données sous forme de paires clé
→ valeur.
Chaque clé est associée à une seule valeur et doit être unique dans la Map.
Contrairement aux List, l’accès aux données ne se fait pas par un index, mais
par la clé.
Caractéristiques principales
Ajouter ou
map[clé] = valeur etudiant["age"] = "21" ajoute/maj
modifier
36
03. Collections en Dart : List, Set, Map
3. Map - Dictionnaire clé → valeur
Exemple
void main() {
Map<String, dynamic> apprenant = {
"nom": "Sara",
"scoreQuiz": 20,
"module": "Flutter"
};
print(apprenant["nom"]); // Sara
apprenant["scoreQuiz"] = 21; // mise à jour du score
[Link]({"badge": "Débutant"});
[Link]("module");
print(apprenant); // {nom: Sara, scoreQuiz: 21, badge: Débutant}
print([Link]("nom")); // true
print([Link](21)); // true
print([Link]); // 3
} 37
04. Les structures conditionnelles
Les conditions permettent à un programme de prendre des décisions.
Les conditions servent à :
if (condition) {
// instructions si la condition est vraie
} else if (autreCondition) {
// instructions si la première est fausse, mais celle-ci vraie
} else {
// instructions si aucune condition n'est vraie
} 38
04. Les structures conditionnelles
Exemple simple:
// Exemple 1 : ET &&
int scoreQuiz = 19;
bool abonnementActif = true;
if (scoreQuiz >= 15 && abonnementActif == true) {
print("Accès au cours autorisé.");
}
// Exemple 2 : OU||
String langue = "Français";
if (langue == "Français" || langue == "Arabe") {
print("Contenu disponible.");
}
//Exemple 2 : NON!
bool estConnecte = false;
if (!estConnecte) {
print("Veuillez vous connecter.");
} 40
04. Les structures conditionnelles
Exemple :
41
04. Les structures conditionnelles
L'instruction switch
Utilisée lorsqu’une variable peut avoir plusieurs valeurs possibles.
43
05. Les structures répétitives (Boucles)
44
05. Les structures répétitives (Boucles)
Une boucle for en Dart est une structure qui permet de répéter un bloc
d’instructions un certain nombre de fois, en utilisant un compteur.
Structure :
Exemple
▪ int i = 1; → Je commence à 1
▪ i <= 5; → Je continue tant que i ≤ 5
print(i);
} 45
05. Les structures répétitives (Boucles)
46
05. Les structures répétitives (Boucles)
3. La boucle while - Répéter tant qu'une condition est vraie
On peut expliquer une boucle while avec une phrase facile à retenir : « Tant
que j’ai faim, je mange. »
Ici, la condition « j’ai faim » est vérifiée avant chaque action. Si elle est vraie,
l’action se répète ; si elle devient fausse, la boucle s’arrête.
int lecon = 1;
while (lecon <= 10) { // tant que leçon est inférieure ou égale à 10
print("Leçon $lecon"); // affiche le nom de la leçon
lecon++; // passe à la leçon suivante pour éviter une boucle infinie
}
▪ La condition i <= 10 est testée avant chaque tour.
▪ Si la condition est vraie, le bloc de code s’exécute.
▪ i++ sert à modifier la variable pour que la boucle puisse s’arrêter à un moment donné.
▪ Si la condition devient fausse, la boucle s’arrête automatiquement. 47
05. Les structures répétitives (Boucles)
4. La boucle do-while – Exécuter au moins une fois
int quiz = 1;
do {
print("Quiz $quiz"); // le code s’exécute au moins une fois
quiz++;
} while (quiz <= 10);
▪ i devient quiz pour représenter les quiz d’un cours
▪ La boucle do…while garantit l’affichage d’au moins
un quiz, même si la condition est fausse dès le départ.
48
05. Les structures répétitives (Boucles)
5. break et continue
Pour contrôler une boucle, on modifie leur comportement normal pendant leur
exécution à l’aide des deux instructions break et continue.
À retenir
▪ continue → sauter une itération de la boucle
49
▪ break → arrêter complètement la boucle
05. Les structures répétitives (Boucles)
5. break et continue
51
06. Les Fonctions
typeRetour nomDeLaFonction(parametres) {
// instructions
return valeur;
} ▪ typeRetour : le type de la valeur retournée par la fonction (int, double,
String, bool, void, etc.).
▪ nomDeLaFonction : identifie la fonction (doit être explicite et clair).
▪ parametres : données passées à la fonction (optionnels).
▪ Bloc d’instructions : contient les actions réalisées par la fonction.
▪ return : renvoie une valeur correspondant au type de retour. 52
06. Les Fonctions
Exemple
// Déclaration de la fonction
int calculerScoreQuiz(int quiz1, int quiz2) {
int resultat = quiz1 + quiz2; // calcul du score
return resultat; // valeur retournée
}
void main() {
// Appel de la fonction
int score = calculerScoreQuiz(5, 3);
print("Le score total du quiz est : $score");
}
▪ La fonction calcule le score total d’un apprenant
▪ Les paramètres représentent les résultats de deux quiz
▪ Exemple simple et cohérent avec le mobile learning
53
06. Les Fonctions
Syntaxe générale
54
06. Les Fonctions
Paramètres nommés
En Dart, les paramètres nommés permettent de rendre l’appel d’une
fonction plus lisible, surtout lorsqu’il y a plusieurs arguments.
L’avantage est que l’ordre des paramètres n’a plus d’importance lors de
l’appel.
Syntaxe générale
56
06. Les Fonctions
Paramètres nommés
Exemple:
// Appels de la fonction
afficherInfo(nom: "Ali", scoreQuiz: 25);
// ordre inversé possible grâce aux paramètres nommés
afficherInfo(scoreQuiz: 30, nom: "Sara");
Exemple:
// Fonction pour afficher le résultat d'une opération sur les scores de quiz
void afficherResultat(int Function(int, int) operation, int quiz1, int quiz2) {
print("Résultat du score total : ${operation(quiz1, quiz2)}");
}
// Fonction pour calculer le score total de deux quiz
int totalScore(int a, int b) => a + b;
void main() {
afficherResultat(totalScore, 10, 4); // Affiche : Résultat du score total : 14
}
▪ operation reste un paramètre fonctionnel, appliqué aux scores de quiz
▪ a et b deviennent quiz1 et quiz2 pour refléter les scores d’un apprenant
▪ Illustratif pour montrer comment passer des fonctions comme
arguments dans le contexte du mobile learning
60
07. Gestion des erreurs : try / catch / finally
61
07. Gestion des erreurs : try / catch / finally
try — On teste un code qui peut provoquer une erreur
Exemple
try {
int x = 10 ~/ 0; // erreur : division par zéro
print(x);
}
62
07. Gestion des erreurs : try / catch / finally
Quand une erreur se produit dans le try, Dart saute vers catch, qui permet :
Exemple
try {
int resultat = 10 ~/ 0;
print(resultat);
} catch (erreur) {
print("Une erreur s'est produite : $erreur");
}
63
07. Gestion des erreurs : try / catch / finally
Exemple
try {
int x = 10 ~/ 0;
print(x);
} catch (e) {
print("Erreur détectée : $e");
} finally {
print("Bloc finally exécuté.");
} 64
08. Programmation Asynchrone
Les Futures
Un Future représente une valeur qui sera disponible dans le futur, après l’exécution
d’une opération asynchrone. Il n’est pas immédiat, il indique simplement qu’une
valeur sera fournie plus tard.
Future<String> fetchData() {
return [Link](Duration(seconds: 2), () {
return "Données reçues !";
}); }
void main() {
print("Début du programme");
fetchData().then((value) {
print(value); // S’affiche après 2 secondes
});
print("Fin du programme");
}
void main() {
fetchData().then((resultat) {
print(resultat);
});
print("En attente...");
}
▪ fetchData() renvoie un Future, donc l’opération est asynchrone.
▪ La méthode .then((resultat) { ... }) permet de définir ce qui sera fait quand la valeur sera disponible.
▪ Pendant que le Future s’exécute, Dart continue à exécuter le reste du programme.
▪ C’est pour cela que "En attente..." s’affiche avant "Données reçues !".
À retenir
Async / Await
Pourquoi utiliser async / await ?
Pour écrire du code asynchrone de manière simple et lisible, comme du code
synchronisé. Évite l’utilisation répétée de .then().
1. async
On ajoute le mot-clé async à une fonction pour indiquer qu’elle contient du
code asynchrone.
Une fonction async retourne toujours un Future, même si elle semble retourner
une valeur normale.
69
08. Programmation Asynchrone
Async / Await
2. await
Le mot-clé await permet d’attendre qu’un Future soit complété avant de
continuer l’exécution.
Le code semble synchrone, mais reste non bloquant pour l’application.
Async / Await
À retenir
retourne un Future.
71
Merci
Master : Ingénierie Techno-pédagogique
et Innovation
DÉVELOPPEMENT APPLICATIONS
MOBILE-LEARNING :
Installation et configuration de
l’environnement de développement Flutter
3
01. Installation d’Android Studio
Principales fonctionnalités d’Android Studio
4
01. Installation d’Android Studio
5
01. Installation d’Android Studio
6
01. Installation d’Android Studio
Installation d’Android Studio
Étape 2 : Installer le programme
Lancez le fichier téléchargé, puis cliquez sur Next et Install en laissant les
options par défaut.
7
02. Configuration du SDK Android
Configuration du SDK Android
8
02. Configuration du SDK Android
Configuration du SDK Android
9
02. Configuration du SDK Android
Configuration du SDK Android
10
02. Configuration du SDK Android
Configuration du SDK Android
11
02. Configuration du SDK Android
Configuration du SDK Android
12
02. Configuration du SDK Android
Configuration du SDK Android
▪ Message de réussite
Le message “was successfully created” indique que
l’installation des composants et la configuration de
l’émulateur sont terminées avec succès.
▪ Cliquer sur “Finish”
Pour finaliser l’installation et ouvrir Android Studio,
cliquez sur Finish
13
02. Configuration du SDK Android
Configuration du SDK Android
14
02. Configuration du SDK Android
Configuration du SDK Android
15
02. Configuration du SDK Android
Configuration du SDK Android
Fenêtre de confirmation
Android Studio affiche une fenêtre pour confirmer
que vous souhaitez installer les outils sélectionnés,
ici : Android SDK Command-line Tools (latest).
16
02. Configuration du SDK Android
Configuration du SDK Android
Installation en cours
Android Studio commence maintenant
l’installation du composant sélectionné : Android
SDK Command-line Tools (latest).
17
02. Configuration du SDK Android
Configuration du SDK Android
Fin de l’installation
Android Studio affiche plusieurs lignes indiquant
que les Command-line Tools ont été :
téléchargés, installés, et configurés correctement.
Les messages ready, complete et finished
confirment que tout s’est bien passé
18
02. Configuration du SDK Android
Configuration du SDK Android
19
03. Installation de Git
20
03. Installation de Git
Ouvrez le fichier d’installation, puis laissez tous les paramètres par défaut.
21
04. Installation et vérification de Flutter
22
04. Installation et vérification de Flutter
23
04. Installation et vérification de Flutter
▪ C:\flutter\bin
24
04. Installation et vérification de Flutter
3. Ajouter Flutter au PATH (variables d’environnement)
25
04. Installation et vérification de Flutter
4. Régénérer le cache Flutter
26
04. Installation et vérification de Flutter
27
04. Installation et vérification de Flutter
6. Vérifier l’installation avec flutter doctor
28
04. Installation et vérification de Flutter
6. Vérifier l’installation avec flutter doctor
▪ Accepter la licence.
VS Code est l’éditeur de code que nous allons utiliser pour écrire, modifier
et organiser le code Flutter.
30
05. Installation et configuration de Visual Studio Code
▪ Ouvrir VS Code.
31
05. Installation et configuration de Visual Studio Code
32
06. Création d’un premier projet Flutter
2. Choisir Application
3. Sélectionner un dossier
33
06. Création d’un premier projet Flutter
Créer un projet Flutter dans VS Code
34
07. Lancement et test de l’application
Lancer l'application
35
07. Lancement et test de l’application
Cela permet d’activer le support Android
pour ce projet.
Tu dois choisir cette option si tu veux tester
l’application sur un émulateur Android, ou
un téléphone Android connecté en USB.
36
07. Lancement et test de l’application
37
07. Lancement et test de l’application
38
Merci
Master : Ingénierie Techno-pédagogique
et Innovation
DÉVELOPPEMENT APPLICATIONS
MOBILE-LEARNING :
Les composants graphiques de base
et la navigation dans Flutter
4
01. Architecture d’un projet Flutter
Un projet Flutter est organisé selon une structure standard qui sépare
clairement le code applicatif, les plateformes cibles et les ressources. Cette
organisation vise à faciliter la maintenabilité, la portabilité multi-plateforme
et le travail en équipe.
▪ lib/
▪ android/
▪ ios/
▪ assets/
▪ [Link]
5
01. Architecture d’un projet Flutter
▪ les widgets,
6
01. Architecture d’un projet Flutter
8
01. Architecture d’un projet Flutter
Permet de définir :
▪ les dépendances (packages Flutter),
▪ la version de l’application,
9
01. Architecture d’un projet Flutter
▪ le démarrage de l’application,
10
01. Architecture d’un projet Flutter
void main() {
runApp(MyApp());
}
runApp() est une fonction fournie par le framework Flutter. Elle prend en
paramètre un widget racine (root widget). Ce widget devient la racine
de l’arbre de widgets de l’application.
Rôle de runApp() :
▪ attacher l’arbre de widgets au moteur Flutter,
void main() {
runApp(MaterialApp(
home: HomePage(),
));
}
13
02. Principes de base de l’interface utilisateur Flutter
14
02. Principes de base de l’interface utilisateur Flutter
15
02. Principes de base de l’interface utilisateur Flutter
1. Concept de widget et arbre de widgets
L’arbre de widgets (Widget Tree)
L’interface Flutter est organisée sous forme d’un arbre de widgets :
▪ chaque widget peut contenir un ou plusieurs widgets enfants. Mais, Il
existe certains widgets qui n’ont pas de propriété child.
▪ l’ensemble forme une structure hiérarchique.
Exemple conceptuel :
▪ MaterialApp
▪ Scaffold
▪ AppBar
▪ Column
▪ Text
▪ Button
AppBar n’est pas un child ; c’est une propriété de Scaffold (appBar:), donc
on ne la met pas dans body ni comme enfant. Cet arbre décrit toute la
structure visuelle de l’application, depuis le widget racine jusqu’aux
éléments les plus simple 16
02. Principes de base de l’interface utilisateur Flutter
17
02. Principes de base de l’interface utilisateur Flutter
▪ un compteur,
18
02. Principes de base de l’interface utilisateur Flutter
2. Widgets StatelessWidget et StatefulWidget
Le widget StatelessWidget
Caractéristiques principales :
▪ interface statique,
▪ simple à comprendre et à maintenir,
▪ performant car sans gestion d’état.
Exemples d’utilisation :
▪ affichage de texte,
▪ icônes,
▪ écrans informatifs,
▪ composants purement visuels.
▪ l’affiche à l’écran,
setState(() {
// modification de l’état
});
Effets de setState() :
▪ signale à Flutter qu’un changement d’état a eu lieu,
MaterialApp(
theme: ThemeData(
primarySwatch: [Link],
),
);
25
03. Structure de base d’un écran Flutter
1. MaterialApp et configuration globale
Autres configurations globales
▪ la langue et la localisation,
▪ le mode debug,
26
03. Structure de base d’un écran Flutter
29
03. Structure de base d’un écran Flutter
Fonctions principales :
◦ affichage du titre de la page,
◦ intégration d’icônes d’actions (actions),
◦ gestion du bouton de retour automatique,
◦ affichage de menus ou d’onglets.
30
03. Structure de base d’un écran Flutter
31
03. Structure de base d’un écran Flutter
▪ via un FloatingActionButton,
33
04. Composants graphiques de base
4.1 Widgets de mise en page
Les widgets de mise en page servent à organiser l’écran : ils décident où les
éléments sont placés, comment ils sont alignés et quelle taille ils occupent.
En Flutter, Row et Column sont les deux widgets les plus importants pour
organiser les éléments à l’écran.
▪ Row permet de placer plusieurs widgets sur une seule ligne horizontale
(de gauche à droite).
34
04. Composants graphiques de base
4.1 Widgets de mise en page
Row( Column(
mainAxisAlignment: [Link], mainAxisAlignment: [Link],
crossAxisAlignment: [Link], crossAxisAlignment: [Link],
mainAxisSize: [Link], mainAxisSize: [Link],
children: [ children: [
Icon([Link]), Icon([Link]),
Icon([Link]), Icon([Link]),
Icon([Link]), Icon([Link]),
], ],
) )
b. Container (boîte)
Container est l’un des widgets les plus utilisés en Flutter. On peut le voir
comme une boîte qui permet de contenir, styliser et positionner un widget.
Container(
width: 120,
height: 120,
margin: [Link](10),
padding: [Link](8),
alignment: [Link],
decoration: BoxDecoration(
color: [Link],
borderRadius: [Link](16),
),
child: Text(
"Flutter",
style: TextStyle(color: [Link]),
),
) 37
04. Composants graphiques de base
4.1 Widgets de mise en page
c. Padding
Padding est un widget qui sert à ajouter un espace intérieur autour d’un widget.
Padding(
padding: [Link](16),
child: Text("Bonjour"),
)
d. SizedBox
SizedBox est un widget très simple qui sert à donner une taille fixe ou à créer de
l’espace entre les widgets.
SizedBox(height: 20), 38
04. Composants graphiques de base
4.1 Widgets de mise en page
d. SafeArea
un widget qui empêche le contenu d’être caché par les zones dangereuses de
l’écran.
▪ encoche (notch)
▪ barre de statut
▪ barre de navigation système
▪ coins arrondis
Il ajoute automatiquement des marges internes pour que le contenu reste visible.
Scaffold(
body: SafeArea(
top: true,
bottom: false, // ignorer la zone du bas
child: Text("Contenu personnalisé"),
),
); 39
04. Composants graphiques de base
4.1 Widgets de mise en page
e. Expanded
Expanded est un widget utilisé dans Row, Column ou Flex pour faire en sorte
qu’un widget prenne l’espace disponible.
Row(
children: [
Expanded(
flex: 1,
child: Container(color: [Link], height: 50),
),
Expanded(
flex: 2,
child: Container(color: [Link], height: 50),
),
],
)
Stack(
children: [
[Link]('assets/[Link]'),
Positioned(
bottom: 10,
right: 10,
child: Text("Texte"),
),
],
)
Center(
child: Text("Centre"),
)
h. Spacer
Spacer est un widget utilisé dans Row ou Column pour ajouter un espace
flexible entre les widgets.
Row(
children: [
Text("Gauche"),
Spacer(), // Spacer() pousse le text "Droite" vers la droite.
Text("Droite"),
],
) 42
04. Composants graphiques de base
4.1 Widgets de mise en page
i. SingleChildScrollView
C’est un widget qui permet de rendre scrollable un seul enfant (child).
Très utile quand tu as une page avec beaucoup de widgets (formulaire,
colonne longue) et tu veux éviter l’erreur overflow.
SingleChildScrollView(
scrollDirection: [Link],
child: Column(
children: [
Text("Titre"),
SizedBox(height: 20),
// beaucoup de widgets...
],
),
)
a. Text
Text est le widget utilisé pour afficher du texte à l’écran. Il sert à afficher : titres,
paragraphes, messages, labels, etc.
Text(
"Flutter", // Le contenu du texte à afficher
style: TextStyle( // Style (apparence) du texte
fontSize: 20, // Taille du texte (20 pixels)
color: [Link], // Couleur du texte (bleu)
fontWeight: [Link], // Texte en gras
),
// Si le texte dépasse, il est coupé et on affiche "..."
overflow: [Link],
) 44
04. Composants graphiques de base
4.2 Widgets d’affichage lib/assets/images/
On ajoute lib/assets/images/ dans
b. Image
[Link] pour déclarer à Flutter que ce
Image est le widget qui sert à afficher une image
dossier contient des fichiers (images) à inclure
dans Flutter.
dans l’application au moment du build
▪ On peut afficher une image depuis :
Ouvre [Link] et ajoute :
▪ les assets (images dans le projet)
flutter:
▪ Internet (URL)
assets:
Image depuis les assets (dans le projet)
- lib/assets/images/
Étape 1 — Déclarer l’image dans [Link]
[Link] = la liste officielle des
Mets tes images dans un dossier, par exemple :
ressources de l’application
[Link](
'lib/assets/images/[Link]',
width: 120,
height: 120,
fit: [Link],
) 45
04. Composants graphiques de base
4.2 Widgets d’affichage
b. Image
Image depuis Internet (URL)
[Link](
"[Link] // Lien de l’image
width: 200,
fit: [Link],
loadingBuilder: (context, child, progress) {
if (progress == null) return child;
return const Center(child: CircularProgressIndicator());
},
errorBuilder: (context, error, stack) {
return const Icon(Icons.broken_image, size: 40);
},
)
46
04. Composants graphiques de base
4.2 Widgets d’affichage
c. CircleAvatar
CircleAvatar est un widget qui sert à afficher une image ou une lettre dans
un cercle. On l’utilise souvent pour une photo de profil.
CircleAvatar(
radius: 40,
backgroundImage: AssetImage('assets/images/[Link]'),
// backgroundImage: NetworkImage('[Link] // depuis
Internet
)
47
04. Composants graphiques de base
4.2 Widgets d’affichage
d. ListTile
ListTile est un widget Flutter prêt à l’emploi pour afficher une ligne structurée
dans une liste. Il permet de montrer un titre, un sous-titre, une icône principale
et une icône secondaire, avec un style cohérent et peu de code.
ListTile(
leading: Icon([Link]),
title: Text("Title"),
subtitle: Text("Subtitle"),
trailing: Icon(Icons.arrow_forward_ios),
onTap: () {
print("Ouverture du profil");
},
)
48
04. Composants graphiques de base
49
04. Composants graphiques de base
4.3 Widgets interactifs (Buttons)
a. ElevatedButton
bouton Material avec une élévation (ombre), utilisé pour les actions principales
(envoyer, valider, confirmer). Quand l’utilisateur clique, le code dans
onPressed s’exécute.
ElevatedButton(
// onPressed: null, -- Bouton désactivé (grisé)
onPressed: () {
print("Bouton cliqué");
},
style: [Link](
backgroundColor: [Link],
foregroundColor: [Link],
padding: [Link](horizontal: 24, vertical: 12),
shape: RoundedRectangleBorder(
borderRadius: [Link](12),
),
elevation: 4,
),
child: Text("Valider"),
) 50
04. Composants graphiques de base
4.3 Widgets interactifs (Buttons)
a. ElevatedButton
▪ Icône + texte
[Link](
onPressed: () {},
icon: Icon([Link]),
label: Text("Envoyer"),
)
51
04. Composants graphiques de base
4.3 Widgets interactifs (Buttons)
b. TextButton
Un bouton sans fond et sans ombre, utilisé pour les actions secondaires
(annuler, retour, lien).
TextButton(
onPressed: () {
print("Cliqué");
},
style: [Link]( // obligatoire
foregroundColor: [Link],
padding: [Link](horizontal: 16, vertical: 8),
textStyle: TextStyle(
fontSize: 16,
fontWeight: [Link],
),
),
child: Text("Annuler"),
)
52
04. Composants graphiques de base
4.3 Widgets interactifs (Buttons)
b. TextButton
▪ Texte + icône
[Link](
onPressed: () {},
icon: Icon(Icons.arrow_forward),
label: Text("Suivant"),
)
53
04. Composants graphiques de base
4.3 Widgets interactifs (Buttons)
c. IconButton
IconButton est un bouton qui affiche seulement une icône (sans texte).
Quand on clique dessus, il exécute une action avec onPressed.
Très utilisé dans :
▪ AppBar (search, menu, back)
▪ actions rapides (delete, edit, share)
IconButton(
onPressed: () {
print("Icône cliquée");
},
icon: Icon([Link]),
)
54
04. Composants graphiques de base
Les widgets de listes et de grilles sont utilisés pour afficher plusieurs éléments
de manière organisée et défilable. Ils sont indispensables lorsqu’une
application doit afficher des données répétées comme : listes d’utilisateurs,
produits, messages, images, etc.
55
04. Composants graphiques de base
ListView est un widget qui permet d’afficher une liste d’éléments scrollable
(verticale ou horizontale).
▪ ou horizontalement.
Lorsque la liste est longue, Flutter ne crée pas tous les widgets en même temps
(selon le type de ListView). les widgets sont créés seulement quand ils
deviennent visibles à l’écran. Cela permet :
▪ d’économiser la mémoire,
▪ d’améliorer la performance,
GridView est un widget qui affiche des éléments en grille (lignes + colonnes),
comme une galerie de photos.
[Link]
Elle est recommandée quand la grille est grande ou dynamique (API, base
de données…). [Link] fonctionne comme [Link].
58
04. Composants graphiques de base
4.4 Widgets de listes et de grilles
b. GridView
[Link] final List<String> students = ["Yassine", "Aya","Hamza", "Sara",];
[Link](
padding: [Link](10),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2, // nombre de colonnes
crossAxisSpacing: 10, // espace entre colonnes
mainAxisSpacing: 10, // espace entre lignes
),
itemCount: [Link], // nombre d’éléments (des étudiants)
itemBuilder: (context, index) {
final name = students[index];
return Container(
padding: [Link](12),
decoration: BoxDecoration(
color: [Link],
borderRadius: [Link](12),
),
child: Column(
mainAxisAlignment: [Link],
children: [
Text(
name, // nom complet
style: TextStyle(color: [Link], fontSize: 16),
),
),
);
},
)
59
05. Formulaires et saisie utilisateur
▪ l’état du formulaire.
60
05. Formulaires et saisie utilisateur
5.1 Champs de saisie (TextField, TextFormField)
a. Form
TextField(
controller: controller,
keyboardType: [Link],
obscureText: false,
maxLength: 30,
decoration: InputDecoration(
labelText: "Email",
hintText: "exemple@[Link]",
prefixIcon: Icon([Link]),
border: OutlineInputBorder(),
),
onChanged: (value) {
print(value);
},
) 62
05. Formulaires et saisie utilisateur
5.1 Champs de saisie (TextField, TextFormField)
c. TextFormField
TextFormField est un TextField spécial pour les formulaires. Il s’utilise à
l’intérieur d’un widget Form et permet facilement :
▪ la validation (validator)
▪ la sauvegarde (onSaved)
▪ la gestion d’erreurs automatiquement.
TextFormField(
controller: emailCtrl,
validator: (value) {
if (value == null || [Link]) {
return "Email obligatoire";
}
if () {
return "Email invalide";
}
return null; // valide
},
onChanged: (value) => print(value),
) 63
05. Formulaires et saisie utilisateur
5.1 Champs de saisie (TextField, TextFormField)
d. Checkbox
Row(
children: [
Checkbox(
value: isChecked,
onChanged: (value) {
setState(() {
isChecked = value!;
});
},
),
Text("J’accepte les conditions"),
],
)
64
05. Formulaires et saisie utilisateur
5.1 Champs de saisie (TextField,
TextFormField) String gender = "M";
Column(
e. Radio children: [
Radio<String>(
Radio est un widget interactif qui permet à value: "M",
groupValue: gender,
l’utilisateur de choisir une seule option parmi onChanged: (value) {
setState(() {
plusieurs. gender = value!;
Contrairement à Checkbox (plusieurs choix },
});
Row(
mainAxisAlignment: [Link],
children: [
Text("Notifications"),
Switch(
value: isOn,
onChanged: (value) {
setState(() => isOn = value);
},
),
],
)
66
05. Formulaires et saisie utilisateur
5.2 Validation et gestion des formulaires
▪ éviter les erreurs de saisie (champ vide, email invalide, mot de passe court),
67
05. Formulaires et saisie utilisateur
5.2 Validation et gestion des formulaires
Form(
key: _formKey,
child: Column(
children: [
// Champ Email
TextFormField(
decoration: const InputDecoration(labelText: "Email"),
keyboardType: [Link],
validator: (value) {
if (value == null || [Link]().isEmpty) {
return "L’email est obligatoire";
}
return null; // valide
},
),
const SizedBox(height: 20),
ElevatedButton(
onPressed: () {
if (_formKey.currentState!.validate()) {
print(" Formulaire valide");
} else {
print(" Formulaire invalide");
}
},
child: const Text("Valider"),
),
],
),
) 68
05. Formulaires et saisie utilisateur
5.2 Validation et gestion des formulaires
À la fin :
69
06. Navigation et routage dans Flutter
Chaque écran représente une page (screen) avec son propre contenu.
70
06. Navigation et routage dans Flutter
Exemple logique :
1. Écran Accueil
▪ remplacer un écran,
74
06. Navigation et routage dans Flutter
Dans une application avec plusieurs écrans, les routes nommées permettent :
▪ de structurer l’application,
▪ projets professionnels,
▪ travail en équipe.
75
06. Navigation et routage dans Flutter
76
06. Navigation et routage dans Flutter
@override
Widget build(BuildContext context) {
final name = [Link](context)!.[Link] as String;//recevoir donnée
return Scaffold(
appBar: AppBar(
title: Text("Profil de $name"),
leading: IconButton(
onPressed: () => [Link](context), // bouton retour
icon: const Icon(Icons.arrow_back),
tooltip: "Retour",
),
),
body: Center(
child: Text("Bienvenue $name"),
),
);
}
} 77
Travaux Pratiques : Écran Login + Navigation + Validation
❑ Objectif du TP ❑ LoginScreen – Validation
▪ Mettre en place un formulaire de ▪ Email obligatoire
connexion avec validation ▪ Mot de passe obligatoire
▪ Implémenter la navigation entre deux ▪ La case « J’accepte les termes et
écrans conditions » doit être cochée
▪ Transmettre des données entre écrans ▪ Si la case n’est pas cochée :
▪ Afficher un message (ex. SnackBar)
❑ Écrans à réaliser ▪ Message : « Vous devez accepter»
▪ LoginScreen
▪ Logo ❑ Navigation
▪ Texte « Welcome » ▪ Si toutes les validations sont correctes :
▪ Formulaire de connexion ▪ Naviguer vers InfoScreen
▪ Bouton Login ▪ Utiliser une route nommée
▪ InfoScreen (pushNamed)
▪ Affichage des informations ▪ Données à transmettre :
saisies ▪ Email
▪ Bouton Back ▪ Mot de passe
▪ Accepté (true / false)
❑ LoginScreen – Contenu
▪ Logo (Icon ou Image) ❑ InfoScreen – Contenu
▪ Texte « Welcome » ▪ Afficher :
▪ Formulaire contenant : ▪ Email
▪ Champ Email ▪ Mot de passe
▪ Champ Mot de passe (masqué) ▪ Texte « Accepté : Oui / Non »
▪ Case à cocher « J’accepte les ▪ En bas de l’écran :
termes et conditions » ▪ Bouton pour revenir à l’écran
▪ Bouton Login précédent
Travaux Pratiques : Écran Login + Navigation + Validation
Merci
Master : Ingénierie Techno-pédagogique
et Innovation
DÉVELOPPEMENT APPLICATIONS
MOBILE-LEARNING :
Accès aux données MySQL dans
Flutter via une API REST en PHP
Architecture client–serveur
3
01. Architecture client–serveur des applications mobiles
4
01. Architecture client–serveur des applications mobiles
Le serveur backend, sous forme d’une API REST en PHP par exemple,
assure le lien entre l’application Flutter et la base de données. Il centralise
la logique métier, contrôle l’accès aux données et garantit la sécurité des
échanges.
5
01. Architecture client–serveur des applications mobiles
6
02. Notion d’API Web et communication applicative
7
03. APIs REST et opérations sur les données
Principe et contraintes du style REST
REST (Representational State Transfer) est un style architectural utilisé pour concevoir
des APIs Web modernes. Il repose sur le protocole HTTP et définit un ensemble de
contraintes permettant d’assurer une communication simple, cohérente et évolutive
entre un client (Flutter) et un serveur (API PHP).
Les principales caractéristiques du style REST sont les suivantes :
▪ La communication est stateless, chaque requête est indépendante et complète
▪ Basée sur des ressources (users, products, etc.)
▪ Chaque ressource a une URL claire
▪ Les méthodes HTTP ont un vrai sens
▪ Réponses standardisées (souvent JSON)
8
03. APIs REST et opérations sur les données
9
03. APIs REST et opérations sur les données
Dans une API REST, les données manipulées par l’application sont
appelées ressources. Une ressource correspond à une entité métier du
système et constitue l’élément central autour duquel l’API est
construite.
10
03. APIs REST et opérations sur les données
Les interactions avec les ressources dans une API REST reposent sur les
opérations CRUD, qui représentent les actions fondamentales
appliquées aux données stockées dans une base de données. Ces
opérations permettent au client de gérer les données sans accéder
directement à la base.
11
03. APIs REST et opérations sur les données
Dans une API REST, chaque opération CRUD est associée à une
méthode HTTP spécifique. Cette correspondance permet de rendre l’API
claire, intuitive et facile à maintenir, tout en conservant des URLs stables.
12
04. Protocole HTTP et échanges client–serveur
13
04. Protocole HTTP et échanges client–serveur
Structure d’une requête HTTP
Une requête HTTP est le message envoyé par le client (Flutter) vers le serveur (API
PHP) afin de demander une action précise. Elle contient toutes les informations
nécessaires au serveur pour comprendre et traiter la demande.
▪ Le body qui contient les données envoyées au serveur (le cas échéant)
14
04. Protocole HTTP et échanges client–serveur
Structure d’une requête HTTP
Exemple:
Objectif : ajouter un utilisateur depuis Flutter vers une API PHP.
POST [Link]
Méthode HTTP
POST → ajouter une donnée
URL
/users → ressource ciblée
▪ Headers
Content-Type: application/json
▪ Body
{
"name": "Ahmed",
"email": "ahmed@[Link]"
15
}
04. Protocole HTTP et échanges client–serveur
Une réponse HTTP est le message retourné par le serveur au client après
le traitement d’une requête. Elle informe le client du résultat de
l’opération demandée et peut contenir des données à exploiter par
l’application Flutter.
16
04. Protocole HTTP et échanges client–serveur
HTTP/1.1 200 OK
▪ Code de statut
▪ Headers
Content-Type: application/json
▪ Body
"success": true,
} 17
04. Protocole HTTP et échanges client–serveur
▪ Codes 4xx : erreurs côté client (400 Bad Request, 401 Unauthorized,
404 Not Found)
18
05. Format JSON et échange de données
Dans le contexte des APIs, le format JSON joue les rôles suivants :
▪ Il est nativement supporté par PHP côté serveur et par Flutter côté client
19
05. Format JSON et échange de données
20
05. Format JSON et échange de données
Exemple:
{
"name": "Ali",
"email": "ali@[Link]"
}
Exemple réponse API par PHP:
{
"success": true,
"message": "Étudiant créé avec succès",
"data": { "id": 10, "name": "Ali", "email": "ali@[Link]" }
}
21
05. Format JSON et échange de données
22
05. Format JSON et échange de données
23
06. Backend PHP et accès sécurisé à MySQL
24
06. Backend PHP et accès sécurisé à MySQL
25
06. Backend PHP et accès sécurisé à MySQL
PDO (PHP Data Objects) est une interface standard permettant à PHP
de communiquer avec différentes bases de données, dont MySQL.
Elle favorise un accès sécurisé et structuré aux données, notamment
grâce à l’utilisation des requêtes préparées.
26
06. Backend PHP et accès sécurisé à MySQL
L’injection SQL est une attaque qui consiste à insérer du code SQL
malveillant dans une requête afin d’accéder ou de modifier des données
de manière illégitime. La sécurisation du backend PHP est donc
indispensable pour protéger la base MySQL.
27
07. Sécurité et organisation d’une API PHP
Principes de sécurité des APIs Web
28
07. Sécurité et organisation d’une API PHP
29
07. Sécurité et organisation d’une API PHP
côté client, le serveur doit toujours vérifier les données reçues avant de
30
07. Sécurité et organisation d’une API PHP
nouvelles fonctionnalités.
données
31
Exemple pratique d’intégration de Flutter avec MySQL
base de données MySQL via une API PHP. Les étudiants mettront en
place un serveur local, créeront une API REST simple de type CRUD et
32
Exemple pratique d’intégration de Flutter avec MySQL
Étape 1 : Préparation du Backend (WAMP/XAMPP)
Base de données : Via PHPMyAdmin, créez une base ecole_db et une table students
(id, nom, email).
Création du dossier : Dans C:\wamp64\www\, créez un dossier nommé api_student.
Votre dossier C:\wamp64\www\api_student\ doit ressembler à ceci :
❑ Fichier de configuration et connexion ([Link]) :
Ce fichier centralise la sécurité (CORS) et la connexion à MySQL via PDO (plus
sécurisé que mysqli).
CORS signifie Cross-Origin Resource Sharing (Partage de ressources entre
origines multiples).
Par défaut, pour des raisons de sécurité, les navigateurs et les systèmes mobiles
bloquent les requêtes HTTP faites vers un domaine (ou une adresse IP) différent
de celui où l'application se trouve.
33
Exemple pratique d’intégration de Flutter avec MySQL
L'origine est définie par : le Protocole (http/https) + le Domaine (ou IP) + le Port.
Le problème : Votre application Flutter (qui tourne sur un téléphone ou un
émulateur) tente d'accéder à un serveur (votre PC avec l'IP 192.168.x.x).
Comme ce ne sont pas les mêmes "origines", le serveur PHP rejette la requête
par sécurité s'il n'est pas configuré pour l'accepter.
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: Content-Type, Authorization");
header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");
34
Exemple pratique d’intégration de Flutter avec MySQL
35
Exemple pratique d’intégration de Flutter avec MySQL
<?php
// 1. Récupération des paramètres de l'URL (GET)
$action = $_GET['action'] ?? '';
switch($action) {
case 'read':
// le code
break;
case 'create':
// le code
break;
case 'update':
// le code
break;
case 'delete':
// le code
break;
default:
echo json_encode(["error" => "Action inconnue"]);
break;
}
?>
36
Exemple pratique d’intégration de Flutter avec MySQL
37
Exemple pratique d’intégration de Flutter avec MySQL
38
Exemple pratique d’intégration de Flutter avec MySQL
Étape 3 : Configuration de Flutter
Avant d’écrire le code (GET/POST…), il faut préparer le projet pour qu’il puisse
envoyer et recevoir des requêtes réseau (HTTP) vers votre API PHP/MySQL.
Dépendance : Ajoutez http: ^1.1.0 (ou version récente) dans le fichier
[Link].
1. Ajouter la dépendance http (bibliothèque réseau)
Flutter n’envoie pas des requêtes HTTP “tout seul”.
On ajoute donc un package (une librairie) qui fournit des fonctions prêtes :
get(), post(), etc.
Dans le fichier [Link] (à la racine du projet), dans la partie
dependencies.
dependencies:
flutter:
sdk: flutter
http: ^1.1.0 39
Exemple pratique d’intégration de Flutter avec MySQL
Étape 3 : Configuration de Flutter
2. Donner la permission Internet à Android (obligatoire)
Même si votre code est correct, Android peut bloquer l’accès Internet si la
permission n’est pas déclarée.
Dans : android/app/src/main/[Link]
Juste avant la balise <application>, mettez :
<uses-permission android:name="[Link]" />
À partir d’Android 9 (API 28), Android bloque par défaut le HTTP non sécurisé.
Donc si votre API est comme ça : [Link]
Elle peut être bloquée (même si Internet permission est OK).
Solution
Dans la balise <application>, ajoutez : android:usesCleartextTraffic="true"
Résultat : Android accepte les appels HTTP (non sécurisés), mais en
production, on privilégie l’utilisation de HTTPS.
40
Exemple pratique d’intégration de Flutter avec MySQL
Étape 4 : Envoi des Requêtes (GET & POST)
A. Requête GET (Récupérer)
On utilise [Link]. La réponse doit être décodée.
var response = await
[Link]([Link]("[Link]
var data = [Link]([Link]);
42
Merci
Master : Ingénierie Techno-pédagogique
et Innovation
DÉVELOPPEMENT APPLICATIONS
MOBILE-LEARNING :
Déploiement Android : Finaliser et Publier
votre Application sur le Play Store
3
01. Finalisation technique de l’application Flutter
Exemple :
<application
android:label="Fse App"
vous oubliez le mot de passe, vous ne pourrez plus jamais mettre à jour votre
7
01. Finalisation technique de l’application Flutter
Signature de l'application (Signing the App)
A. Générer la clé
▪ Windows :
keytool -genkey -v -keystore $env:USERPROFILE\[Link] -storetype JKS
-keyalg RSA -keysize 2048 -validity 10000 -alias upload
▪ Mac/Linux :
keytool -genkey -v -keystore ~/[Link] -storetype RSA -keysize 2048 -
validity 10000 -alias upload
8
01. Finalisation technique de l’application Flutter
9
01. Finalisation technique de l’application Flutter
Maintenant que vous avez généré votre clé de signature, vous devez
indiquer à Flutter comment l'utiliser pour signer votre application
automatiquement.
10
01. Finalisation technique de l’application Flutter
11
01. Finalisation technique de l’application Flutter
import [Link]
12
01. Finalisation technique de l’application Flutter
13
01. Finalisation technique de l’application Flutter
Signature de l'application (Signing the App)
Cherchez le bloc android { ... } et modifiez-le pour ajouter à l’intérieur la
configuration signingConfigs comme ceci :
signingConfigs { // ajouter
create("release") {
keyAlias = keystoreProperties["keyAlias"] as String?
keyPassword = keystoreProperties["keyPassword"] as String?
val storeFilePath = keystoreProperties["storeFile"] as String?
storeFile = storeFilePath?.let { file(it) }
storePassword = keystoreProperties["storePassword"] as String?
}
}
buildTypes { // modifier
getByName("release") {
signingConfig = [Link]("release")
}
}
14
01. Finalisation technique de l’application Flutter
15
01. Finalisation technique de l’application Flutter
En 2026, la distinction entre les types de comptes et les preuves d'identité est
devenue extrêmement précise.
17
02. Création et validation du compte développeur
Création et Vérification du Compte
▪ Une fois payé, le compte reste en état "En cours de vérification". Tant que
vos documents d'identité n'ont pas été validés par une équipe humaine
ou une IA de Google (sous 2 à 5 jours ouvrés), vous ne pouvez pas créer
de fiche d'application.
Conseil Pro : Assurez-vous que le nom sur votre profil de paiement Google
(Google Pay) est exactement le même que celui sur votre pièce d'identité,
sinon la vérification échouera automatiquement.
19
03. Mise en ligne et processus de validation
Pour publier votre application, vous devez préparer une Fiche Store
complète comprenant des assets graphiques de haute qualité (icône
512x512, bannière 1024x500 et 4 à 8 captures d'écran réelles), ainsi qu'un
contenu textuel optimisé (nom, description avec mots-clés). Il est également
crucial de bien définir la catégorie, d'ajouter jusqu'à 5 tags pertinents et de
fournir un e-mail d'assistance fonctionnel.
20
03. Mise en ligne et processus de validation
2. Politique et Confidentialité
▪ Hébergement : Si vous n'avez pas de site web, vous pouvez utiliser des outils
comme Google Sites, GitHub Pages ou des générateurs de politiques de
confidentialité en ligne.
21
03. Mise en ligne et processus de validation
2. Politique et Confidentialité
22
03. Mise en ligne et processus de validation
2. Politique et Confidentialité
▪ Si votre app n'est pas destinée aux enfants, assurez-vous que votre
fiche store ne semble pas les attirer (évitez les dessins trop enfantins si
l'app est pour adultes).
23
03. Mise en ligne et processus de validation
▪ Critères : Ce doivent être des comptes Google réels. Ils ne peuvent pas
être des comptes "bots" ou des comptes créés juste pour l'occasion ;
Google peut détecter les comportements inhabituels.
▪ Méthode : Vous collectez les adresses e-mail de vos testeurs et vous les
ajoutez à une "Liste de testeurs" dans la Play Console.
24
03. Mise en ligne et processus de validation
25
03. Mise en ligne et processus de validation
Pendant ces 14 jours, vos testeurs peuvent vous envoyer des commentaires
directement via le Play Store (ces avis sont privés et ne seront pas visibles par
le public plus tard).
26
03. Mise en ligne et processus de validation
Attention : Si vos réponses sont trop vagues (ex: "Tout s'est bien passé"),
Google peut rejeter votre demande et vous obliger à recommencer 14 jours
de tests supplémentaires.
27
03. Mise en ligne et processus de validation
Une fois les 14 jours de tests obligatoires validés, cliquez sur "Demander
l'accès à la production". Votre application sera soumise à un examen
technique et humain par Google pour vérifier sa conformité.
28
Merci