Résumé Flutter :
Architecture examen dév multiplateforme :
- QCM Canadien (4pts)
- Partie analyse (8pts)
- Partie problème (8pts)
I- Généralités :
Flutter est un framework Open Source de développement
d'applications multiplateforme, conçu par Google
1- Avantages:
Un seul code pour iOS et Android
Développement et Exécution Rapides
Contrairement à React Native qui utilise JavaScript
pour créer des composants natifs, Flutter propose des
widgets personnalisés
2- Architecture
Une application Mobile Flutter est composé d'un ensemble de
widgets, ressources et fichiers de configuration
Un Widget est une classe Dart qui retourne un élément
graphique
Il existe deux types principaux de widgets dans Flutter :
- StatelessWidget (Widget sans état) : Ces widgets sont
statiques, ce qui signifie qu'ils ne changent pas d'état une
fois créés. Ils sont généralement utilisés pour des
éléments d'interface utilisateur qui ne changent pas en
réponse à une interaction de l'utilisateur ou à d'autres
événements. Par exemple, un texte statique, une icône ou
un bouton simple peuvent être des StatelessWidgets.
- StatefulWidget (Widget avec état) : Ces widgets peuvent
maintenir un état interne qui peut changer au fil du
temps, en réponse à des événements. Par exemple, un
bouton qui peut être activé ou désactivé en fonction
d'une condition ou un champ de texte dont le contenu
peut être modifié par l'utilisateur seraient implémentés
en utilisant StatefulWidget.
3- Installation
Voici les étapes pour installer Flutter :
1. Sélectionnez le SE sur lequel vous installez Flutter.
2. Téléchargez et extrayez le fichier zip (par exemple,
C:\flutter).
3. Ajoutez le plugin Flutter dans votre IDE (par exemple,
Android Studio).
II- Commandes Flutter
- Création nouveau projet flutter :
flutter create my_app
- Lancement application flutter :
flutter run lib/[Link]
- Consulter version flutter :
flutter --version
- Récupérer les dépendances dans le fichier [Link] :
flutter pub get
- Ajouter des packages externes :
flutter pub add package_nom
- Mettre à jour les dépendences :
flutter pub update
- Verification de la santé de l'installation de flutter :
flutter doctor
NB: vous pouvez consulter autres commandes sur
[Link]
III- Packages Flutter
Les packages Flutter sont des éléments essentiels pour enrichir
les fonctionnalités des applications :
- Firebase Auth : pour l'authentification sécurisée et la
gestion des utilisateurs.
- Firebase Core : base pour l'intégration des services
Firebase, comme le stockage de données en temps réel.
- Google Maps Flutter : intégration de cartes interactives
pour la visualisation géographique.
- HTTP : communication simplifiée avec les services Web.
- Tflite : pour l'inférence de modèles TensorFlow Lite dans
les applications.
- Speech-to-Text et Text-to-Speech : pour la reconnaissance
vocale et la synthèse vocale.
IV- Exemple Partie Analyse
Réponse : Programme Dart représentant un StatefulWidget
nommé MyApp2 permettant de retourner MaterialApp
contenant un Scaffold avec trois éléments : un AppBar, un
Body, et un FloatingActionButton.
L'AppBar affiche le texte TP compteur, le Body contient "Salam
tout le monde" avec un compteur qui est initialisé à zéro, et à
chaque fois qu’on clique sur le bouton flottant, le compteur
s'incrémente grâce à la fonction setState() appelée qui met à
jour l'état de l'application en ajoutant une nouvelle valeur au
compteur et ainsi affiche "OK Stateful" sur la console
V- Exemple Partie Problème
Prenons exemple d'une Application mobile Cross-platform
fonctionnelle avec Flutter utilisant FireBase et la
Géolocalisation Google Maps nommée CovidTracker
1. Faut être capable de concevoir un diagramme de classe
ou un Use Case selon la question (si jamais un Use Case
est demandé, 2 acteurs seront le minimum requis)
2. Faut être capable aussi de concevoir un diagramme de
navigation (Screenshots de l'App avec ordre et une toute
petite description pour chacune afin de clarifier leurs
utilités)
3. Expliquer le choix de la technologie choisie pour la
création de l'application (dans notre cas, c'est Flutter)
4. Rédaction du code (on ne sera pas demandé d'écrire le
tout mais seulement une partie)
- Ajout des dépendances
- Ajout de la classe main et la classe de l'application
[Link] par exemple
______________________________________________________________
______
//[Link]
import 'package:flutter/[Link]';
import '[Link]';
void main() {
runApp(const MyApp());
}
______________________________________________________________
______
//[Link]
import 'package:flutter/[Link]';
import 'screens/[Link]';
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: ‘CovidApp',
theme: ThemeData(
primarySwatch: [Link],
),
home: const Login(),
debugShowCheckedModeBanner: false,
);
}
}
______________________________________________________________
______
- Ajout d'une seule partie de l'application prenons par
exemple le [Link]
- //screens/[Link]
-
- import '[Link]';
- import 'package:flutter/[Link]';
- class Login extends StatefulWidget {
- const Login({Key? key}) : super(key: key);
-
- @override
- State<Login> createState() =>_LoginState();
- }
-
- class _LoginState extends State<Login> {
- String email = '';
- String password = '';
- final _formKey = GlobalKey<FormState>();
-
- @override
- Widget build(BuildContext context) {
- return Scaffold(
- backgroundColor: [Link][50],
- appBar: AppBar(
- title: Text('Covid Tracker'),
- actions: [
- [Link](
- onPressed: (){
- [Link](context,
MaterialPageRoute(builder:
(context)=>Register()));
- },
- icon: Icon([Link]),
- label: Text('Register'))
- ],
- ),
- body: Container(
- padding:
[Link](vertical: 20,
horizontal: 50),
- child: Form(
- key: _formKey,
- child: ListView(
- children: [
- [Link]('assets/images/covi
[Link]'),
- SizedBox(height: 50.0,),
- TextFormField(
- decoration: InputDecoration(
- hintText: 'email',
- prefixIcon:
Icon([Link]),
- fillColor: [Link],
- filled: true
- ),
- onChanged: (val) {
- setState(() {
- email = val;
- });
- },
- validator: (val) =>
val!.isEmpty ? 'Enter a valid email':null,
- ),
- SizedBox(height: 20.0,),
- TextFormField(
- decoration: InputDecoration(
- hintText: 'password',
- prefixIcon:
Icon([Link]),
- fillColor: [Link],
- filled: true
- ),
- onChanged: (val) {
- setState(() {
- password = val;
- });
- },
- validator: (val) =>
val!.length < 6 ?
- 'Enter a valid password 6+
Chars':null,
- obscureText: true,
- ),
- SizedBox(height: 20.0,),
- RaisedButton(
- color: [Link],
- child: Text('Sign In',style:
TextStyle(color: [Link]),),
- onPressed: () {
- if(_formKey.currentState!.val
idate()){
- print('ok !!!');
- }
-
- },
-
- )
-
- ],
- ),
- ),
- ),
- );
- }
- }
@ym-G6