Base Flutter
Base Flutter
V. Essentiel 38
VI. Auto-évaluation 38
A. Exercice .......................................................................................................................................................................38
B. Test ..............................................................................................................................................................................40
On choisit : « Create New Flutter Project ». À l'écran suivant, il faut faire « Next ».
Étape 2 : ensuite on donne un nom au projet. Il faut écrire son nom en minuscule.
Le champ « Project location » permet de définir l'emplacement où sera stocké le projet sur le disque dur,
Le champ « Description » permet de faire une rapide description du projet,
Les champs des langages de programmation : Kotlin pour Android et Swi pour iOS,
Pour « Plateforms », on coche iOS et Android.
On valide. Android Studio va nous finaliser le projet.
On arrive alors sur l'écran suivant :
La fenêtre principale est divisée en deux : à gauche l'arborescence du projet et à droite le fichier sélectionné.
Les fichiers qui contiennent du code « Dart » se trouvent dans le répertoire lib. Ces fichiers ont l'extension .dart. Au
départ, le projet comprend uniquement le fichier : [Link]. Toute l'application est dans ce fichier.
On construit un widget Center qui a un fils : un widget Text. Ce dernier a deux propriétés : textAlign et style.
Ce dernier appelle un widget TextStyle.
Méthode
On pourra aussi créer nos propres widgets. La création de widget va permettre de réutiliser notre code à différents
endroits de notre application.
La définition d'un widget va commencer par le mot clé class en étant étendu avec un stateLessWidget. Le
nom widget commencera par une majuscule : « BasicsPage ». Le widget est défini dans un bloc entre
accolades. À l'intérieur de ce bloc, on a une fonction obligatoire : la fonction build. Pour la définir, il faut taper le
mot clé build. Cette fonction va retourner le widget et donc un élément de l'interface utilisateur. Dans notre
widget MaterialApp, on va mettre au niveau de la propriété home.
Exemple
1 class MyApp extends StatelessWidget {
2 // This widget is the root of your application.
3 @override
4 Widget build(BuildContext context) {
5 return MaterialApp(
6 title: 'Flutter Demo',
7 theme: ThemeData(
8 primarySwatch: [Link],
9 ),
10 home: BasicsPage() // appel du widget créé dessous
11 );
12 }
13 }
14
15 class BasicsPage extends StatelessWidget{
16 @override
17 Widget build(BuildContext context) {
18 return
19 }
20 }
Définition Scaffold
Le scaffold est le squelette de l'application, il est présent dans toutes les applications. Il comprend les widgets
suivants avec les propriétés :
appBar : la barre du haut
body : le corps de notre application
floatingButtonAction : un bouton en bas
drawer : un menu sur le côté
Définition AppBar
L'appBar est un widget qui vient se situer en haut de l'écran. En général, il contient le titre de l'application. Il
peut aussi accueillir des boutons.
1 return Scaffold(
2 appBar: AppBar(
3 title: Text("Le titre de l'application"),
4 actions:<Widget> [
5 IconButton(onPressed: pressedAction, icon:Icon([Link]))
6 ], ),
7 );
Définition Le drawer
Le drawer est un menu caché qui glisse horizontalement, il est déplié avec l'icône « Hamburger », 3 traits. Pour
construire le drawer, le widget Drawer est appelé, il a comme enfant un widget Column que nous verrons plus
tard dans le cours qui contiendra l'entête du menu et la liste des choix avec des widgets Text.
1 drawer: Drawer(
2 child:Column(
3 children: [
4 DrawerHeader(child: Text('menu de navigation')
5 ),
6 Text("Onglet 1"),
7 Text("Onglet 2"),
8 Text("Onglet 3"),],
9 )
10 ),
Exemple
Définition Le FloatingActionButton
Le floatingActionButton est un widget qui est un bouton flottant en bas à gauche, on peut le retrouver
dans certaines applications de messagerie. En appuyant dessus, on crée un nouveau message, c'est ce bouton qui
va exécuter une méthode.
1 ),
2 floatingActionButton: FloatingActionButton(
3 onPressed: pressedAction,
4 backgroundColor: [Link],
5 child: Icon([Link]),
6 ),
Exemple
Ici, on centre le container dans le body du Scaffold. Les propriétés height et width permettent de définir
la taille du container.
Question 1
Question 2
Question 4
Question 5
Exemple
1 Text("Ceci est une première chaine",
2 style: TextStyle(
3 color: [Link],
4 fontSize:20,
5 fontWeight: FontWeight.w800,
6 fontStyle:[Link]
7 ),
8 textAlign: [Link],
9)
Ici, on définit un widget Text qui prend en argument la chaîne de caractères : « Ceci est une chaîne de
caractères ». On lui spécifie un Style avec le widget TextStyle. À l'intérieur de ce style, on va définir la couleur
du texte et l'aspect de la police de caractères. On peut aussi spécifier l'alignement de cette zone de texte. Ici, on
centre le texte.
Si on veut pousser la personnalisation de l'application, on peut mettre en place une police de caractères
spécifique dans le constructeur de TextStyle avec la propriété fontFamily.
Méthode
Étape 1 : dans l'arborescence de notre projet, il faut créer un répertoire « assets ». On fait un clic
droit - new - Directory. À l'intérieur de ce dossier, on crée un dossier « fonts » pour stocker nos polices dans notre
application. On va « glisser-déposer » la police de caractères dans le répertoire.
Widgets de base
Complément
Sur Internet, on peut trouver des polices de caractères gratuites sur le site Google Fonts1.
Méthode
Étape 2 : maintenant, il convient de modifier le fichier [Link] et de l'enrichir d'une rubrique « fonts ».
Dans Android Studio, cliquez sur Pub get pour finir l'installation de la police de caractères.
Étape 3 : une fois installée, on peut définir la font dans la propriété font-family dans le widget TextStyle.
Exemple
1 style: TextStyle(
2 color: [Link],
3 fontSize:25,
4 fontWeight: FontWeight.w800,
5 fontStyle:[Link],
6 fontFamily:'BubbleShine'
1 [Link]
Méthode
Voici comment créer un widget Text configuré avec une police de caractères, un style et une couleur :
1 Text simpleText(String text){
2 return Text(
3 text,
4 style: TextStyle(
5 color: [Link],
6 fontSize:25,
7 fontWeight: FontWeight.w800,
8 fontStyle:[Link],
9 fontFamily:'BubbleShine'
10 ),
11 textAlign: [Link]
12 );
Complément
Pour créer un widget avec cette configuration, on aura juste à l'appeler :
simpleText(“On peut réutiliser notre texte”)
Cela évite que l'on ait à chaque fois à reconfigurer notre widget Text de base.
Exemple
1 body:Center(
2 child: Container(
3 height: 150,
4 width: 150,
5 child: Icon([Link],
6 color:[Link],
7 size: 50,)
8 ),
9)
Dans le container, on met un Icon Home en tant qu'enfant. On lui applique une taille de 50 avec size et on lui
applique la couleur verte.
Les icônes pourront être ajoutées à l'endroit souhaité pour personnaliser le floatingActionButton ou la barre
d'onglets.
Méthode
De la même manière que pour les polices de caractères, il convient de créer un dossier images dans le répertoire
assets. Ensuite, on dépose les images dans ce dossier. On va aussi ajouter le chemin des images dans le fichier
[Link].
Attention
Il s'agit d'un fichier yaml. Il faut faire attention à l'indentation dont l'importance est cruciale. Par exemple
assets doit être à deux espaces de la gauche.
Méthode
Une fois le fichier à jour, il faut cliquer sur le bouton pub get. Maintenant que l'image est déclarée, il ne reste
plus qu'à l'incorporer dans le projet.
Exemple
1 [Link]('assets/images/[Link]',
2 width: 150,
3)
Complément
Si on peut insérer des images en dur dans le projet, on peut aussi les afficher en les chargeant depuis internet. La
syntaxe est [Link](‘[Link]
1 [Link]('[Link]
ezimgfmt=rs:272x90/rscb23/ng:webp/ngcb23')
Exemple
1 body: Center(
2 child: Card(
3 child: Container(
4 color: [Link],
5 height: 150,
6 width: 300,
7 child: simpleText("Ma premiere Card"),
8 ),
9 elevation: 10,
10 ),
11 ),
Ici, on a défini un widget Card à l'intérieur du widget Center. À l'intérieur, il contient un widget Text.
Exemple
1 child: Card(
2 child:
3 Container(
4 color: [Link],
5 height: 150,
6 width: 300,
7 child: Padding(
8 padding: [Link](10, 10,0,0),
9 child: simpleText("Ma premiere Card"),
10 )
11 ),
12 elevation: 7.5,
13 ),
Dans cet exemple, Padding permet positionner le widget simpleText à 10 par rapport au Haut et 10 par
rapport à gauche.
Widget Column
Le widget Column permet d'aligner verticalement des widgets. On peut le voir comme une pile d'éléments. Dans
d'autres langages, on parlera de stackview. Ce widget possède des enfants : children. Ils s'espacent dans la
column selon la propriété mainAxisAlignement.
Cette propriété peut prendre différentes valeurs :
Start : les éléments sont groupés en haut de colonne.
End : les éléments sont groupés en bas de la colonne.
Center : les éléments sont groupés au centre de la colonne.
SpaceEvenly : les éléments sont séparés les uns des autres avec le même espacement.
SpaceBetween : les éléments sont séparés les uns des autres avec le même espacement en étant collés aux
extrémités.
SpaceAround : les éléments sont séparés les uns des autres avec le même espacement avec des marges
réduites aux extrémités.
11 color: [Link],
12 width: 50,
13 ),
14 Container(
15 height: 50,
16 width: 50,
17 color: [Link]
18 )
19 ],)
Exemple [Link]
1 Row(
2 mainAxisAlignment: [Link],
3 children: [
4 Container(
5 height: 50,
6 color: [Link],
7 width: 50,
8 ),
9 Container(
10 height: 50,
11 color: [Link],
12 width: 50,
13 ),
14 Container(
15 height: 50,
16 width: 50,
17 color: [Link]
18 )
19 ],
La propriété mainAxisAlignement est aussi présente. Elle se comporte similairement, mais horizontalement.
Exemple
Commençons par définir une column à l'intérieur du body. À l'intérieur de column, nous allons empiler
4 widgets expanded qui ont pour enfant un widget container. On définit une couleur pour chaque
container. Par défaut, la propriété flex est égale à 1.
1 Body(
2 Column(
3 children: [
4 Expanded(
5 child: Container(
6 color: [Link],
7 ),
8 ),
9 Expanded(
10 child: Container(
11 color: [Link],
12 ),
13 ),
14 Expanded(
15 child: Container(
16 color: [Link],
17 ),
18 ),
19 Expanded(
20 child: Container(
21 color: [Link],
22 ),
23 ),
24 ],
25 )
1 Expanded(
2 flex: 3,
3 child: Container(
4 color: [Link],
5 ),
6 ),
Si on fait la somme des propriétés sachant que par défaut elle est à 1 :
1 (container rouge) + 1 (container bleu) + 3 (container jaune) + 1 (container vert) = 6
La proportion du container jaune sera de 3/6 de l'écran. On voit que cela correspond bien à la moitié de
l'écran.
Pour se simplifier dans les calculs, on prendra 10 pour la somme des flex. Ensuite, on répartit la somme des
propriétés flex sur chaque widget Expanded.
Adoptons la répartition suivante :
Rouge : flex = 1 soit 1/10
Bleu : flex = 2 soit 2/10
Jaune : flex = 2 soit 2/10
Vert : flex = 5 soit 5/10
Question 1
Question 2
Question 4
Question 5
V. Essentiel
Au fil de ce cours, nous avons vu la première partie des bases de Flutter. La philosophie de Flutter consiste à
combiner des widgets : tout est widget. Un widget peut contenir un ou plusieurs widgets. On a abordé les widgets
StateLess. Un widget « stateLess » ne change pas d'état au cours de sa vie.
Dans un premier temps, retenez le squelette d'une application Flutter :
Appbar : la barre de titre de l'application avec la possibilité d'ajout de boutons.
Hamburger-menu : drawer permettant la navigation à l'intérieur de l'application.
FloatingButtonAction : un bouton en bas à gauche.
Body : la racine de l'application qui peut contenir un widget Container.
Dans un second temps, quelques widgets de base de Flutter :
Widget Text : composant qui permet d'afficher du texte dans nos applications avec la possibilité d'ajout de
polices de caractères personnalisées.
Widget Icon : composant affichant une icône.
Widget Row : composant qui permet un alignement horizontal des widgets.
Widget Column : composant qui permet un alignement vertical des widgets.
Widget Expanded : qui permet d'étendre un widget à l'espace libre dans une Column ou Row.
VI. Auto-évaluation
A. Exercice
Dans cet exercice, nous allons mettre en pratique les différents widgets étudiés dans ce cours. Le but est de
construire une carte de visite minimaliste avec pour forme un rectangle. La carte sera composée d'une image et de
textes. Les textes seront :
L'intitulé de la formation
Le nom de la personne
L'adresse mail de la personne
Il conviendra d'utiliser les widgets Row et Column pour positionner les éléments.
Il faudra intégrer une image au projet.
Auto-évaluation
B. Test
Exercice 1 : Quiz [solution n°12 p.47]
Question 1
Question 2
Question 4
Question 5
Question 1
Question 2
Question 3
Question 4
Question 5
Question 1
Question 2
Question 3
Question 4
Question 5
p. 40 Solution n°3
1 import 'package:flutter/[Link]';
2 void main() {
3 runApp(MyApp());
4}
5 class MyApp extends StatelessWidget {
6 @override
7 Widget build(BuildContext context) {
8 return MaterialApp(
9 title: 'Flutter Demo',
10 theme: ThemeData(
11 primarySwatch: [Link],
12 ),
13 home: CarteDeVisite()
14 );
15 }
16 }
17
18 class CarteDeVisite extends StatelessWidget {
19
20 @override
21 Widget build(BuildContext context) {
22 // TODO: implement build
23 throw UnimplementedError();
24 }
25 }
p. 40 Solution n°4
Créez un répertoire dans le projet qui contiendra les assets. Puis à l'intérieur de ce dernier, on crée un répertoire
image. On glisse l'image dans le répertoire image. Ensuite, il faut modifier le fichier [Link] pour configurer /
indiquer le chemin où se trouve l'image à la rubrique assets.
1 # To add assets to your application, add an assets section, like this:
2 assets:
3 - assets/images/[Link]
4# - images/a_dot_ham.jpeg
p. 40 Solution n°5
p. 40 Solution n°6
1 body: Center(
2 child: Card(
3 child: Container(
4 height: 150,
5 width: 300,
6 color:[Link]
7 ),
8 ),
9)
p. 40 Solution n°7
1 Card(
2 child:
3 Container(
4 color: [Link],
5 height: 150,
6 width: 300,
7 child: Column(
8 children: [
9 Expanded(
10 flex:2,
11 child: Container(
12 color: [Link],
13 )),
14 Expanded(
15 flex:6,
16 child: Container(
17 color:[Link]
18 )),
19 Expanded(
20 flex:2,
21 child: Container(
22 color:[Link]
23 ))
24 ],
25 )
26 ),
27 elevation: 7.5,
28 ),
p. 40 Solution n°8
1 Expanded(
2 flex:2,
3 child: Text("Développeur Full Stack"
4
5 )),
p. 40 Solution n°9
1 Expanded(
2 flex:6,
3 child: Row(
4 children: [
5 Expanded(
6 flex:1,
7 child: Padding(
8 padding: const [Link](8.0),
9 child: Container(
10 child: [Link]('assets/images/[Link]',),
11 ),
12 )),
13 Expanded(flex:2
14 ,child: Padding(
15 padding: const [Link](8.0),
16 child: Container(
17 child: Text("DUPOND Philippe"),
18
19 ),
20 ))
21 ],
22 )
23 ),
p. 40 Solution n°10
1 Expanded(
2 flex:2,
3 child: Row(
4 children: [
5 Padding(
6 padding: const [Link](3.0),
7 child: Text("Email : PhilippeDupond@[Link]"),
8 )
9 ],
10 )
11 )
p. 40 Solution n°11
44 )
45 ),
46 Expanded(
47 flex:2,
48 child: Row(
49 children: [
50 Padding(
51 padding: const [Link](3.0),
52 child: Text("Email : PhilippeDupond@[Link]"),
53 )
54 ],
55 )
56 )
57 ],
58 )
59 ),
60 elevation: 7.5,
61 ),
62 ),
63 );
64 }
Question 1
Question 2
Question 3
Question 4
Question 5