Row et Column dans Flutter
Sommaire
- 1- Objectif
- 2- Présentation
- 3- Le widget Row en Flutter
- 3.1- Utilisation
- 3.2- Définir l'alignement de l'axe transversal
- 3.3-
mainAxisAlignment
- 3.4- Propriétés
- 3.5- Exemple
- 4- Le widget Column en Flutter
- 4.1- Utilisation
- 4.2- Propriétés
- 4.3- Exemple
- 5- Comparaison entre Row et Column
- 6- Applications
- 6.1- Exercice 0: Création d'une mise en page simple avec
Row
etColumn
- 6.2- Exercice 02: Création d'une mise en page complexe avec Row et Column
- 6.3- Exercice 03: Création d'une liste dynamique avec ListView
- 6.3.1- Cours Flutter
Row et Column dans Flutter
-
Objectif
- Apprendre à organiser les widgets en lignes et en colonnes sur l’écran en Flutter
-
Présentation
- Row et Column sont des widgets dans Flutter et la plupart du temps, chaque mise en page peut être décomposée en ligne et en colonne.
- La ligne et la colonne sont les deux widgets essentiels de Flutter qui permet aux développeurs d’aligner les child horizontalement et verticalement selon nos besoins.
- Ces widgets sont très nécessaires lorsque nous concevons l’interface utilisateur de l’application dans Flutter.
-
Le widget Row en Flutter
-
Utilisation
- Une ligne est un widget de mise en page multi-enfant qui prend une liste de widgets comme ses enfants.
- Une ligne affiche les widgets dans la vue visible, c’est-à-dire qu’elle ne défile pas.
- Nous pouvons contrôler la façon dont un widget de ligne aligne ses enfants en fonction de notre choix en utilisant la propriété
crossAxisAlignment
etmainAxisAlignment
. - L’axe transversal de la ligne s’exécutera verticalement , et l’axe principal s’exécutera horizontalement .
- Voici comment vous pouvez utiliser le widget Row :
-
Définir l’alignement de l’axe transversal
crossAxisAlignmentargument
: L’alignement des ‘child’ dans l’axe transversal peut être défini en passant uncrossAxisAlignmentargument
. Si vous ne transmettez pas l’argument, l’alignement par défaut de l’axe transversal est centré. Les valeurs possibles sont :start
: Placez les enfants aussi près que possible du début de l’axe transversal.end
: Placez les enfants le plus près possible de l’extrémité de l’axe transversal.center
: Placez les enfants de manière à ce que leurs centres soient alignés avec le milieu de l’axe transversal.stretch
: Demander aux enfants de remplir l’axe transversal.baseline
: placez les enfants le long de l’axe transversal de sorte que leurs lignes de base correspondent.-
mainAxisAlignment
- Le
mainAxisAlignment
contrôle les ‘child’ à afficher dans la direction horizontale de la ligne ‘Row‘, mais contrôle la direction verticale du Colonne ‘column‘ -
Propriétés
- Voici quelques propriétés couramment utilisées avec le widget Row :
children
: Une liste de widgets que vous souhaitez disposer horizontalement. Chaque élément de cette liste représente un widget enfant à afficher dans la rangée.mainAxisAlignment
: Cette propriété vous permet de définir l’alignement principal des enfants dans la rangée. Par défaut, la valeur est MainAxisAlignment.start, ce qui signifie que les enfants seront alignés à gauche. Vous pouvez également utiliser MainAxisAlignment.center pour les aligner au centre ou MainAxisAlignment.end pour les aligner à droite, entre autres.crossAxisAlignment
: Cette propriété contrôle l’alignement transversal des enfants dans la rangée. Par défaut, la valeur est CrossAxisAlignment.center, ce qui signifie que les enfants seront centrés verticalement. Vous pouvez également utiliser CrossAxisAlignment.start pour les aligner en haut ou CrossAxisAlignment.end pour les aligner en bas, par exemple.mainAxisSize
: Cette propriété détermine la taille principale de la rangée en fonction de la somme des tailles principales de ses enfants. Par défaut, la valeur est MainAxisSize.max, ce qui signifie que la rangée s’étendra pour occuper tout l’espace disponible dans la direction principale. Vous pouvez également utiliser MainAxisSize.min pour que la rangée ait la taille minimale possible en fonction de son contenu-
Exemple
- Dans cet exemple, trois widgets enfants (deux Text et un RaisedButton) sont empilés verticalement dans la colonne, centrés à la fois horizontalement et verticalement en raison des propriétés mainAxisAlignment et crossAxisAlignment définies.
-
Le widget Column en Flutter
-
Utilisation
- Le widget Column en Flutter est utilisé pour créer une disposition verticale d’enfants, ce qui signifie que les widgets enfants sont empilés les uns en dessous des autres.
- C’est l’une des manières de créer des mises en page verticales dans une application Flutter.
- Le widget de colonne comme la ligne est un widget de mise en page multi-enfant qui prend une liste de widgets comme ses enfants.
- Voici comment vous pouvez utiliser le widget Column :
-
Propriétés
- Voici quelques propriétés couramment utilisées avec le widget Column :
children
: Une liste de widgets que vous souhaitez empiler verticalement. Chaque élément de cette liste représente un widget enfant à afficher dans la colonne.mainAxisAlignment
: Cette propriété vous permet de définir l’alignement principal des enfants dans la colonne. Par défaut, la valeur est MainAxisAlignment.start, ce qui signifie que les enfants seront alignés à gauche. Vous pouvez également utiliser MainAxisAlignment.center pour les aligner au centre ou MainAxisAlignment.end pour les aligner à droite, entre autres.crossAxisAlignment
: Cette propriété contrôle l’alignement transversal des enfants dans la colonne. Par défaut, la valeur est CrossAxisAlignment.center, ce qui signifie que les enfants seront centrés horizontalement. Vous pouvez également utiliser CrossAxisAlignment.start pour les aligner à gauche ou CrossAxisAlignment.end pour les aligner à droite, par exemple.mainAxisSize
: Cette propriété détermine la taille principale de la colonne en fonction de la somme des tailles principales de ses enfants. Par défaut, la valeur est MainAxisSize.max, ce qui signifie que la colonne s’étendra pour occuper tout l’espace disponible dans la direction principale. Vous pouvez également utiliser MainAxisSize.min pour que la colonne ait la taille minimale possible en fonction de son contenu.-
Exemple
- Dans cet exemple, trois widgets enfants (deux Text et un RaisedButton) sont empilés verticalement dans la colonne, centrés à la fois horizontalement et verticalement en raison des propriétés mainAxisAlignment et crossAxisAlignment définies.
-
Comparaison entre Row et Column
-
Applications
-
Exercice 0: Création d’une mise en page simple avec
Row
etColumn
- Utiliser les widgets row et column pour réaliser la figure suivante:
-
Exercice 02: Création d’une mise en page complexe avec Row et Column
- Objectif : Créer une mise en page complexe qui comprend plusieurs widgets Row et Column pour afficher des informations de contact. La mise en page doit ressembler à ceci :
- Créez une nouvelle application Flutter.
- Utilisez les widgets Row et Column pour organiser les éléments de l’interface utilisateur conformément au schéma ci-dessus.
- Personnalisez l’apparence des éléments pour qu’ils aient l’apparence souhaitée.
- Ajoutez un bouton de contact qui affiche une boîte de dialogue lorsque vous appuyez dessus avec un message comme « Contacter cette personne ».
- Assurez-vous que la mise en page est réactive et fonctionne bien sur différents appareils.
-
Exercice 03: Création d’une liste dynamique avec ListView
- Objectif : Créer une liste dynamique qui affiche une liste d’articles avec des images, des titres et des descriptions.
- Les articles doivent être affichés verticalement à l’aide du widget ListView.
- Créez une nouvelle application Flutter.
- Créez une liste d’objets d’article (chaque objet doit contenir une image, un titre et une description).
- Utilisez un widget ListView.builder pour afficher dynamiquement la liste d’articles en utilisant les données de la liste.
- Personnalisez l’apparence des éléments de la liste.
- Assurez-vous que la liste défile correctement et que vous pouvez cliquer sur chaque article pour afficher des détails supplémentaires.
Row(
children: <Widget>[
// Listez ici les widgets que vous souhaitez
// disposer horizontalement
WidgetEnfant1(),
WidgetEnfant2(),
WidgetEnfant3(),
// ...
],
)
Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Text('Widget Enfant 1'),
Text('Widget Enfant 2'),
RaisedButton(
onPressed: () {
// Action à effectuer lorsque le bouton est pressé
},
child: Text('Bouton Enfant'),
),
],
)
Column(
children: <Widget>[
// Listez ici les widgets que vous souhaitez empiler
//verticalement
WidgetEnfant1(),
WidgetEnfant2(),
WidgetEnfant3(),
// ...
],
)
Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text('Widget Enfant 1'),
Text('Widget Enfant 2'),
RaisedButton(
onPressed: () {
// Action à effectuer lorsque le bouton est pressé
},
child: Text('Bouton Enfant'),
),
],
)
Récipient |
Colonne/Ligne |
---|---|
Prend exactement un widget enfant | Prend plusieurs widgets enfants (illimités) |
Options d’alignement et de style riches disponibles | Options d’alignement disponibles, mais il n’y a pas d’options de style |
Largeur flexible (ex. largeur enfant, largeur disponible, …) | Prend toujours la pleine hauteur (colonne) / largeur (ligne) disponible |
Parfait pour un style et un alignement personnalisés | Indispensable si les widgets sont placés les uns à côté des autres |
Solution
import 'package:flutter/material.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return const MaterialApp(
home: Home(),
);
}
}
class Home extends StatelessWidget {
const Home({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Formation apcpedagogie.com'),
backgroundColor: const Color.fromARGB(190, 24, 255, 255),
),
body: Column(
//Tous les éléments sont emballés
children: [
//Dans cette colonne
const SizedBox(
height: 15,
),
const SizedBox(
height: 20,
child: Text('Démonstration de Row',
style: TextStyle(
color: Color.fromRGBO(69, 235, 18, 1),
fontWeight: FontWeight.bold)),
),
Row(
children: [
/////////////Premier élément
Card(
margin: const EdgeInsets.all(10),
elevation: 8,
child: Container(
padding: const EdgeInsets.all(25),
child: const Text(
'apcpedagogie',
style: TextStyle(color: Colors.blue),
),
),
),
const SizedBox(
width: 2,
),
//////////////////Deuxsième élément
Card(
margin: const EdgeInsets.all(10),
elevation: 8,
child: Container(
padding: const EdgeInsets.all(25),
child: const Text(
'apcpedagogie',
style: TextStyle(color: Colors.blue),
),
),
),
const SizedBox(
width: 2,
),
/////////////////Troisième élément
Card(
margin: const EdgeInsets.all(10),
elevation: 8,
child: Container(
padding: const EdgeInsets.all(25),
child: const Text(
'apcpedagogie',
style: TextStyle(color: Colors.blue),
),
),
),
],
),
const SizedBox(
height: 30,
),
const SizedBox(
height: 20,
child: Text(
'Démonstration de Column',
style: TextStyle(
color: Color.fromARGB(255, 18, 50, 235),
fontWeight: FontWeight.bold),
),
),
Column(
children: [
/////////////Premier élément
Card(
margin: const EdgeInsets.all(10),
elevation: 8,
child: Container(
padding: const EdgeInsets.all(25),
child: const Text(
'apcpedagogie',
style: TextStyle(color: Color.fromARGB(255, 18, 50, 235)),
),
),
),
const SizedBox(
width: 4,
),
//////////////////Deuxsième élément
Card(
margin: const EdgeInsets.all(10),
elevation: 8,
child: Container(
padding: const EdgeInsets.all(25),
child: const Text(
'apcpedagogie',
style: TextStyle(color: Color.fromARGB(255, 18, 50, 235)),
),
),
),
/////////////////Troisième élément
Card(
margin: const EdgeInsets.all(10),
elevation: 8,
child: Container(
padding: const EdgeInsets.all(25),
child: const Text(
'apcpedagogie',
style: TextStyle(color: Color.fromARGB(255, 18, 50, 235)),
),
),
),
],
)
],
),
);
}
}
|--------------------------------|
| Photo de profil |
|--------------------------------|
| Nom et prénom |
| Adresse email |
|--------------------------------|
| Numéro de téléphone |
| Adresse |
|--------------------------------|
| Bouton de contact |
|--------------------------------|
Solution
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: MyContactPage(),
);
}
}
class MyContactPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Informations de contact'),
),
body: Center(
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
CircleAvatar(
radius: 80,
backgroundImage: NetworkImage('URL_de_votre_photo_de_profil'),
),
SizedBox(height: 20),
Text(
'Nom et prénom',
style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
),
Text(
'adresse.email@example.com',
style: TextStyle(fontSize: 18),
),
SizedBox(height: 20),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(Icons.phone, size: 30),
SizedBox(width: 10),
Text(
'Numéro de téléphone',
style: TextStyle(fontSize: 18),
),
],
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(Icons.location_on, size: 30),
SizedBox(width: 10),
Text(
'Adresse',
style: TextStyle(fontSize: 18),
),
],
),
SizedBox(height: 30),
ElevatedButton(
onPressed: () {
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text('Contact'),
content: Text('Contacter cette personne'),
actions: [
TextButton(
onPressed: () {
Navigator.of(context).pop();
},
child: Text('Fermer'),
),
],
);
},
);
},
child: Text('Contacter'),
),
],
),
),
);
}
}
Solution
import 'package:flutter/material.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: MyArticleList(),
);
}
}
class Article {
final String imageUrl;
final String title;
final String description;
Article({required this.imageUrl, required this.title, required this.description});
}
class MyArticleList extends StatelessWidget {
final List<Article> articles = [
Article(
imageUrl: 'URL_de_l_image_1',
title: 'Article 1',
description: 'Description de l\'article 1',
),
Article(
imageUrl: 'URL_de_l_image_2',
title: 'Article 2',
description: 'Description de l\'article 2',
),
Article(
imageUrl: 'URL_de_l_image_3',
title: 'Article 3',
description: 'Description de l\'article 3',
),
// Ajoutez plus d'articles si nécessaire
];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Liste d\'articles'),
),
body: ListView.builder(
itemCount: articles.length,
itemBuilder: (context, index) {
return ListTile(
leading: Image.network(articles[index].imageUrl),
title: Text(articles[index].title),
subtitle: Text(articles[index].description),
onTap: () {
// Afficher des détails supplémentaires de l'article
showDialog(
context: context,
builder: (context) {
return AlertDialog(
title: Text(articles[index].title),
content: Text('Détails de l\'article...'),
actions: [
TextButton(
onPressed: () {
Navigator.of(context).pop();
},
child: Text('Fermer'),
),
],
);
},
);
},
);
},
),
);
}
}