CHAPITRE 2.2

Structure minimale d'une application Flutter

Comprenez les fondations de toute application Flutter
Maintenant que votre environnement est configuré, il est temps de comprendre comment fonctionne une application Flutter. Dans cette section, nous allons découvrir la structure minimale nécessaire pour créer une application Flutter. Nous commencerons par le fichier le plus important : main.dart, puis nous explorerons la fonction main(), le rôle de runApp(), et enfin nous afficherons notre premier widget à l'écran. Chaque étape sera expliquée en détail, avec du code minimal et épuré.

2.2Comprendre la structure minimale d'une application Flutter

2.2.1 – Le fichier main.dart

Avant de commencer à écrire du code Flutter, il est essentiel de comprendre où se trouve le point de départ de votre application. Dans Flutter, ce point de départ est toujours le fichier main.dart.

📁 Rôle du fichier main.dart

Le fichier main.dart est le point d'entrée de votre application Flutter. C'est le premier fichier que Flutter lit et exécute quand vous lancez votre application. Sans ce fichier, votre application ne peut pas démarrer.

Analogie : Imaginez un livre. Le fichier main.dart est comme la première page du livre. C'est là que l'histoire commence. De la même manière, main.dart est l'endroit où votre application Flutter commence son histoire. 📖

📍 Emplacement dans le projet

Quand vous créez un nouveau projet Flutter (avec la commande flutter create ou depuis votre éditeur), Flutter crée automatiquement une structure de dossiers. Le fichier main.dart se trouve toujours au même endroit :

mon_projet_flutter/
  ├── lib/
  │   └── main.dart    ← C'est ici !
  ├── android/
  ├── ios/
  └── ... (autres dossiers)
Structure du projet Flutter
Exemple de structure du dossier projet Flutter (avec main.dart dans lib/)

Le fichier main.dart est toujours dans le dossier lib/ (qui signifie "library", bibliothèque en anglais). C'est dans ce dossier que vous placerez la majorité de votre code Dart.

Pourquoi le dossier s'appelle "lib" ?
En programmation, une "library" (bibliothèque) est un ensemble de code organisé. Le dossier lib/ contient tout le code source de votre application. C'est une convention standard en Dart et Flutter.

🔗 Lien avec l'exécution

Quand vous lancez votre application Flutter (en appuyant sur le bouton "Run" dans votre éditeur ou en exécutant flutter run), voici ce qui se passe :

  1. Flutter cherche le fichier lib/main.dart
  2. Flutter lit ce fichier de haut en bas
  3. Flutter exécute la fonction main() qui se trouve dans ce fichier
  4. Votre application démarre !
Important :
Le fichier main.dart doit obligatoirement contenir une fonction appelée main(). Sans cette fonction, Flutter ne saura pas par où commencer et votre application ne pourra pas démarrer. Nous verrons cette fonction en détail dans la prochaine section.

👀 À quoi ressemble un fichier main.dart vide ?

Quand vous créez un nouveau projet Flutter, le fichier main.dart contient déjà du code. Pour l'instant, ne vous préoccupez pas de ce code. Dans cette section, nous allons créer notre propre version très simple, étape par étape.

Conseil pratique :
Avant de continuer, ouvrez votre projet Flutter dans votre éditeur et localisez le fichier lib/main.dart. Regardez son contenu actuel, mais ne vous inquiétez pas s'il semble complexe. Nous allons tout reconstruire ensemble, de manière très simple.

💡 Points clés à retenir

  • Le fichier main.dart est le point d'entrée de votre application
  • Il se trouve toujours dans le dossier lib/
  • Flutter lit ce fichier en premier quand vous lancez l'application
  • Ce fichier doit contenir une fonction main()

2.2.2 – La fonction main()

Maintenant que vous savez où se trouve le fichier main.dart, découvrons ce qu'il doit contenir. La fonction main() est le point de départ de l'exécution de votre application. C'est ici que tout commence.

🎯 Point d'entrée obligatoire

En Dart (le langage utilisé par Flutter), la fonction main() est obligatoire. C'est la première fonction que Dart exécute quand vous lancez votre programme. Sans elle, votre code ne peut pas s'exécuter.

Pourquoi "main" ?
Le nom "main" signifie "principal" en anglais. C'est la fonction principale de votre programme. C'est une convention universelle en programmation : presque tous les langages de programmation utilisent une fonction main() comme point d'entrée.

📝 Structure minimale

La fonction main() a une structure très simple. Voici sa forme la plus basique :

void main() {
  
}

Analysons ce code ligne par ligne :

  • void : Ce mot-clé signifie "vide" ou "rien". Il indique que la fonction main() ne retourne aucune valeur. C'est toujours le cas pour main() en Dart.
  • main : C'est le nom de la fonction. Il doit être exactement "main", en minuscules.
  • () : Les parenthèses indiquent que c'est une fonction. Pour l'instant, elles sont vides (pas de paramètres).
  • { } : Les accolades délimitent le corps de la fonction. C'est entre ces accolades que vous écrirez votre code.
Important :
Le nom de la fonction doit être exactement main, en minuscules. Si vous écrivez Main() ou MAIN(), Dart ne le reconnaîtra pas comme point d'entrée et votre application ne démarrera pas.

🧪 Test simple : afficher un message

Pour vérifier que notre fonction main() fonctionne, ajoutons une simple instruction pour afficher un message dans la console. Nous utiliserons la fonction print() que vous connaissez déjà du chapitre 1.2.

void main() {
  print('Mon application Flutter démarre !');
}

Ce code affiche le message "Mon application Flutter démarre !" dans la console quand l'application démarre. C'est un bon moyen de vérifier que la fonction main() est bien exécutée.

Où voir le message ?
Quand vous lancez votre application Flutter, le message s'affiche dans la console de votre éditeur (le panneau en bas qui affiche les logs). Cherchez une zone appelée "Debug Console" ou "Terminal" dans votre éditeur.

🚀 Exemple avec runApp()

Afficher un message dans la console, c'est bien, mais ce n'est pas ce que nous voulons. Nous voulons afficher quelque chose à l'écran de notre application ! Pour cela, nous devons utiliser une fonction spéciale appelée runApp().

Voici comment utiliser runApp() dans la fonction main() :

void main() {
  runApp();
}

Pour l'instant, nous appelons simplement runApp() sans rien lui donner. Mais cette fonction a besoin d'un paramètre pour savoir quoi afficher. Nous découvrirons ce paramètre dans la prochaine section.

Note importante :
Si vous essayez d'exécuter ce code maintenant, vous obtiendrez une erreur. C'est normal ! La fonction runApp() nécessite un paramètre. Nous allons voir comment l'utiliser correctement dans la section suivante. Pour l'instant, retenez simplement que runApp() est la fonction qui démarre votre application Flutter.
Que fait runApp() ?
La fonction runApp() est fournie par Flutter. Elle initialise le framework Flutter et prépare l'application pour l'affichage. C'est elle qui transforme votre code Dart en une interface visible à l'écran. Sans runApp(), votre application ne peut pas afficher d'interface utilisateur.

💡 Points clés à retenir

  • La fonction main() est obligatoire et est le point d'entrée de votre application
  • Elle doit s'appeler exactement main (en minuscules)
  • Elle commence toujours par void main() { }
  • La fonction runApp() démarre l'application Flutter
  • runApp() doit être appelée dans main() pour que l'application fonctionne
Structure complète pour l'instant :
Voici la structure minimale que nous avons vue jusqu'à présent :
void main() {
  runApp();
}
Dans la prochaine section, nous allons voir ce que nous devons mettre entre les parenthèses de runApp().

2.2.3 – Le rôle de runApp()

Dans la section précédente, nous avons vu que runApp() est nécessaire pour démarrer une application Flutter. Mais cette fonction ne fonctionne pas toute seule. Elle a besoin de savoir quoi afficher. C'est ce que nous allons découvrir maintenant.

🔧 Initialisation de Flutter

Quand vous appelez runApp(), Flutter fait plusieurs choses importantes :

  1. Flutter initialise son moteur de rendu (le système qui dessine à l'écran)
  2. Flutter prépare l'interface utilisateur
  3. Flutter attend de savoir quoi afficher

C'est pourquoi runApp() a besoin d'un paramètre : elle doit savoir quel élément afficher à l'écran.

Analogie :
Imaginez que vous allumez votre téléviseur. L'écran s'allume (c'est l'initialisation de Flutter), mais il est noir car il ne sait pas encore quoi afficher. Vous devez lui dire quelle chaîne regarder (c'est le paramètre de runApp()). 📺

🌳 Le widget racine

Le paramètre que vous donnez à runApp() s'appelle le widget racine. Un widget est un élément d'interface utilisateur en Flutter. Nous allons découvrir les widgets en détail dans les prochains chapitres, mais pour l'instant, sachez simplement qu'un widget est quelque chose qui peut être affiché à l'écran.

Le widget racine est le premier widget que Flutter affiche. C'est la base de toute votre interface. Tous les autres éléments de votre application seront des enfants de ce widget racine.

Qu'est-ce qu'un widget ?
Pour l'instant, pensez simplement qu'un widget est un élément que vous pouvez afficher à l'écran : du texte, un bouton, une image, etc. Nous explorerons les widgets en détail plus tard. Pour cette section, nous utiliserons uniquement le widget le plus simple : Text(), qui affiche du texte.

📝 Syntaxe de runApp()

Voici comment utiliser runApp() avec un widget :

void main() {
  runApp(Directionality(
    textDirection: TextDirection.ltr,
    child: Text('Bonjour Flutter !'),
  ));
}

Analysons ce code :

  • runApp( : Nous appelons la fonction runApp()
  • Directionality( : C'est un widget qui indique la direction du texte (de gauche à droite pour le français). Flutter en a besoin pour afficher correctement le texte.
  • textDirection: TextDirection.ltr : Indique que le texte va de gauche à droite (ltr = left to right)
  • child: Text('Bonjour Flutter !') : Le widget Text() est l'enfant de Directionality. C'est lui qui affiche le texte.
  • ) : Nous fermons l'appel à runApp()
Pourquoi Directionality ?
Flutter a besoin de savoir dans quelle direction afficher le texte (gauche à droite pour le français, droite à gauche pour l'arabe, etc.). Le widget Directionality fournit cette information. C'est une contrainte technique de Flutter : Text() doit être dans un contexte qui définit la direction du texte.

Qu'est-ce que Text() ?
Text() est un widget Flutter très simple qui affiche du texte à l'écran. Il prend en paramètre une chaîne de caractères (le texte à afficher) entre guillemets. Ici, il est l'enfant de Directionality.

🧪 Exemple minimal avec Text()

Voici le code complet le plus simple possible pour une application Flutter :

import 'package:flutter/material.dart';

void main() {
  runApp(Directionality(
    textDirection: TextDirection.ltr,
    child: Text('Bonjour Flutter !'),
  ));
}

Ce code :

  1. Importe les widgets Flutter nécessaires
  2. Définit la fonction main() (point d'entrée)
  3. Appelle runApp() pour démarrer Flutter
  4. Donne à runApp() un widget Directionality qui contient un widget Text() affichant "Bonjour Flutter !"
Important : Pourquoi Directionality ?
Flutter nécessite un contexte de direction pour afficher du texte. Le widget Directionality fournit ce contexte. Sans lui, vous obtiendrez une erreur. C'est une contrainte technique de Flutter que nous devons respecter.

Note : Dans les prochains chapitres, nous utiliserons MaterialApp qui fournit automatiquement ce contexte. Pour l'instant, nous utilisons Directionality pour rester minimal et comprendre les bases.

▶️ Tester le code

Maintenant, testez ce code dans votre projet Flutter :

  1. Ouvrez le fichier lib/main.dart
  2. Remplacez tout le contenu par le code ci-dessus (avec l'import)
  3. Lancez votre application (bouton "Run" ou flutter run)
Premier affichage Flutter avec Directionality et Text()
Affichage du texte « Bonjour Flutter ! » avec Directionality et Text() dans une application Flutter minimale.
Résultat attendu :
Vous devriez voir le texte "Bonjour Flutter !" affiché à l'écran de votre application. Le texte sera probablement petit et positionné en haut à gauche de l'écran. C'est normal ! Nous apprendrons à le centrer et à le rendre plus grand dans les prochaines sections.
Si vous voyez une erreur :
Assurez-vous d'avoir bien ajouté la ligne import 'package:flutter/material.dart'; en haut du fichier. Sans cette ligne, Flutter ne connaît pas Text() et runApp().

💡 Points clés à retenir

  • runApp() initialise Flutter et démarre l'application
  • runApp() a besoin d'un paramètre : le widget racine
  • Le widget racine est le premier élément affiché à l'écran
  • Text() est un widget simple qui affiche du texte
  • L'import import 'package:flutter/material.dart'; est nécessaire pour utiliser les widgets Flutter
Structure complète minimale :
Voici la structure minimale complète d'une application Flutter :
import 'package:flutter/material.dart';

void main() {
  runApp(Directionality(
    textDirection: TextDirection.ltr,
    child: Text('Bonjour Flutter !'),
  ));
}
C'est le code le plus simple possible pour afficher quelque chose à l'écran avec Flutter. Directionality fournit le contexte nécessaire, et Text() affiche le texte.
Félicitations ! 🎉
Vous avez maintenant créé votre première application Flutter ! C'est un grand pas. Vous comprenez :
  • Où se trouve le fichier main.dart
  • Comment fonctionne la fonction main()
  • Le rôle de runApp()
  • Comment utiliser Directionality pour fournir le contexte de direction
  • Comment afficher un widget simple (Text())
Dans le prochain chapitre, nous allons construire sur ces bases pour créer des interfaces plus riches et plus belles. Continuez comme ça ! 💪
🎯 Récapitulatif de la section 2.2
Vous avez appris :
  • ✅ Le fichier main.dart est le point d'entrée de votre application
  • ✅ La fonction main() est obligatoire et est le point de départ de l'exécution
  • runApp() démarre Flutter et nécessite un widget racine
  • Directionality est nécessaire pour fournir le contexte de direction
  • Text() est un widget simple pour afficher du texte
  • ✅ Les widgets sont organisés en arbre
Prochaine étape : Dans le chapitre 2.3, nous allons découvrir MaterialApp et apprendre à créer des interfaces plus structurées avec Scaffold et d'autres widgets de base. À bientôt ! 🚀