Les Widgets en Flutter

Introduction

Bonjour à tous, j’espère que vous allez bien. Flutter est un framework open-source développé initialement par google. Ce framework est basé sur le langage Dart, un langage assez proche de JavaScript par sa syntaxe et son histoire. Aujourd’hui nous abordons un terme important dans le développement d’application mobile avec Flutter, à savoir les widgets.

Qu’est-ce qu’un widget ?

Un widget est un élément basique qui vous permet de construire vos écrans en Flutter. Les widgets décrivent à quoi vos interfaces utilisateurs ou vues devraient ressembler. On peut imaginer qu’un widget représente un bloc Lego que vous pouvez assembler avec d’autres bloc Lego (Widgets) pour construire une structure.

Certains widgets sont visuels, c’est à dire apparaissent à l’écran, d’autres non. Flutter met à notre disposition une multitude de widgets.

Concrètement, les widgets sont des classes en Dart qui héritent directement ou indirectement de la classe Widget. Comme nous avons vu dans le chapitre La Programmation Orientée Objet en Dart, une classe est un « élément » logiciel qui est composé de constructeurs, d’attributs et de méthodes.

Dart
class Chat{
  String? nom;
  String? couleur;
  int? age;
  
  Chat(String? nom, String? couleur, int? age){
    this.nom = nom;
    this.couleur = couleur;
    this.age = age;
  }
  
  void mioler(){
    print("$nom miaou");
  }
  
  void manger(String nourriture){
    print("Miam, je mange $nourriture");
  }
  
  void marcher(){...}
}

Ainsi, vous pouvez le paramétrer selon votre besoin. En se basant sur notre exemple précédent, on peut décider de créer un objet chat en ne précisant que le nom, la couleur ou l’âge :

Dart
...

void main(){
  Chat c1 = Chat(nom: "Milou");
  print(c1.nom); //Sortie Milou
  
  Chat c2 = Chat(couleur: "Gris");
  print(c1.nom); //Sortie Gris
  
  Chat c3 = Chat(age: "12");
  print(c1.age); //Sortie 12
  
  //Ou
  Chat c4 = Chat(nom:"Milou", couleur: "Gris", age:"12");
  ...
}

Il en est ainsi pour les widgets. Voyons un exemple avec le widget text qui nous permet d’afficher du text à l’écran :

Dart
Text(
  'Hello, Ruth! How are you?',
  textAlign: TextAlign.center,
  overflow: TextOverflow.ellipsis,
  style: const TextStyle(fontWeight: FontWeight.bold),
)

Ce code donne le résultat suivant :

Toutefois, les widgets peuvent être classés en deux catégories : Les widgets sans état ou encore StatelessWidget et les widgets avec état ou StatefulWidget. Voyons ensemble en détail, de quoi il s’agit.

Les widgets sans état

Les stafelessWidget sont des widgets qui n’ont aucun état. C’est à dire qu’une fois qu’ils ont déjà été construits, il ne peuvent plus changer d' »aspect » ou d’état pendant l’exécution du programme. C’est le cas du widget Text.

Dart
class Text extends StatelessWidget {
  ...
  const Text(
    String this.data, {
    Key? key,
    this.style,
    this.strutStyle,
    this.textAlign,
    this.textDirection,
    this.locale,
    this.softWrap,
    this.overflow,
    this.textScaleFactor,
    this.maxLines,
    this.semanticsLabel,
    this.textWidthBasis,
    this.textHeightBehavior,
  });
  ...
  @override
  Widget build(BuildContext context){...}
  ...  
}

Le widget Text hérite de StatelessWidget. Par conséquent, on dit que le widget Text est immuable.

Les widgets avec état

Les stafefulWidget sont des widgets qui ont un état. C’est à dire qu’une fois qu’ils ont déjà été construits, il peuvent changer d' »aspect » à la suite d’une action de l’utilisateur ou un processus pendant l’exécution du programme. C’est le cas du widget Image qui permet d’afficher des images à l’écran.

Dart
class Image extends StatefulWidget {
  ...
  const Image({
    Key? key,
    required this.image,
    this.frameBuilder,
    this.loadingBuilder,
    this.errorBuilder,
    this.semanticLabel,
    this.excludeFromSemantics = false,
    this.width,
    this.height,
    this.color,
    this.opacity,
    this.colorBlendMode,
    this.fit,
    this.alignment = Alignment.center,
    this.repeat = ImageRepeat.noRepeat,
    this.centerSlice,
    this.matchTextDirection = false,
    this.gaplessPlayback = false,
    this.isAntiAlias = false,
    this.filterQuality = FilterQuality.low,
  });
  ...
  @override
  Widget build(BuildContext context){...}
  ...
}

NB: vous pouvez remarquer qu’une méthode build est déclarée. En effet, quand une classe hérite de la classe StatelessWidget ou StatefulWidget, celle-ci doit obligatoirement redéfinir cette méthode, qui se charge de construire le widget.

Quelques widgets basiques

Flutter met à notre disposition une multitude de widgets. Nous allons parler de quelques-uns, les plus utilisés. Vous pouvez visiter le site officiel de Flutter pour voir la bibliothèque des widgets que vous pourrez utiliser dans vos applications.

Text

Ce widget nous permet d’afficher du text à l’écran. Il contient plusieurs paramètres facultatifs dont le text à afficher qui est obligatoire.

Dart
Text(
  //Désigne le text doit s'afficher
  'Hello, Ruth! How are you?',
  
  //Permet d'aligner le text. 
  textAlign: TextAlign.center, 
  
  //Permet d'appliquer un style au text qui s'affiche à l'écran
  style: const TextStyle(fontWeight: FontWeight.bold),
)

Column

Si vous avez besoin d’afficher une liste non scrollable de widgets de façon verticale (par défaut, de haut en bas), vous pouvez utiliser Column.

Dart
Column(
  //List de widget enfant
  children: const <Widget>[
    //Premier enfant
    Text('Deliver features faster'),
    
    //Deuxième enfant
    Text('Craft beautiful UIs'),
    
    //Troisie enfant
    Expanded(
      child: FittedBox(
        child: FlutterLogo(),
      ),
    ),
  ],
)

Row

Row permet d’afficher une liste non scrollable de widget comme le widget Column mais cette fois en ligne ou de façon horizontale (par défaut, de gauche à droite).

Dart
Row(
  children: const <Widget>[
    Expanded(
      child: Text('Deliver features faster', textAlign: TextAlign.center),
    ),
    Expanded(
      child: Text('Craft beautiful UIs', textAlign: TextAlign.center),
    ),
    Expanded(
      child: FittedBox(
        child: FlutterLogo(),
      ),
    ),
  ],
)

ListView

ListView permet d’afficher une liste de widget scrollable.

Dart
ListView(
  padding: const EdgeInsets.all(8),
  children: <Widget>[
    Container(
      height: 50,
      color: Colors.amber[600],
      child: const Center(child: Text('Entry A')),
    ),
    Container(
      height: 50,
      color: Colors.amber[500],
      child: const Center(child: Text('Entry B')),
    ),
    Container(
      height: 50,
      color: Colors.amber[100],
      child: const Center(child: Text('Entry C')),
    ),
  ],
)

GridView

GridView permet d’afficher une grille scrollable de widget. Un peu comme une galerie d’image ou une galerie de produit sur un site e-commerce.

Dart
GridView.count(
  primary: false,
  padding: const EdgeInsets.all(20),
  crossAxisSpacing: 10,
  mainAxisSpacing: 10,
  crossAxisCount: 2,
  children: <Widget>[
    Container(
      padding: const EdgeInsets.all(8),
      color: Colors.teal[100],
      child: const Text("He'd have you all unravel at the"),
    ),
    Container(
      padding: const EdgeInsets.all(8),
      color: Colors.teal[200],
      child: const Text('Heed not the rabble'),
    ),
    Container(
      padding: const EdgeInsets.all(8),
      color: Colors.teal[300],
      child: const Text('Sound of screams but the'),
    ),
    Container(
      padding: const EdgeInsets.all(8),
      color: Colors.teal[400],
      child: const Text('Who scream'),
    ),
    Container(
      padding: const EdgeInsets.all(8),
      color: Colors.teal[500],
      child: const Text('Revolution is coming...'),
    ),
    Container(
      padding: const EdgeInsets.all(8),
      color: Colors.teal[600],
      child: const Text('Revolution, they...'),
    ),
  ],
)

ElevatedButton

ElevatedButton permet d’afficher un bouton surélevé à l’écran.

Dart
ElevatedButton(
  onPressed: () {},
  child: const Text('Enabled'),
),

Image

Image permet d’afficher une image à partir de différentes sources (via une url, un fichier sur ma mémoire du téléphone, etc).

Dart
//Afficher une image sur internet
Image.network("https://www.youskil.com/wp-content/uploads/2022/10/cropped-ys_logo.png"),

//Afficher une images depuis les assets
Image.asset("assets/images/...jpg"),

Conclusion

Les widgets sont des éléments absolument incontournables dans la conception d’application en Flutter. Si vous souhaitez être assez à l’aise dans la construction de vos applications, je vous invite fortement à vous familiariser avec la bibliothèque de widget. Je vous remercie pour votre attention. En attendant, n’hésitez pas à laisser un commentaire au bas de cet article si vous rencontrez des difficultés. Peace !

1 Comments

  1. Excellent travail, je suis motivé d’apprendre avec vous.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *