Dart : qu'est-ce que c'est, les caractéristiques du langage Flutter et la programmation

Auteur : IT Sectr Publié le : 2026-02-10 Temps de lecture : 12 min

Dart est un langage de programmation de Google, créé spécialement pour le framework multiplateforme Flutter. Il combine la compilation JIT pour un rechargement à chaud ultra-rapide et la compilation AOT pour des performances natives dans les builds de production. Dart est utilisé non seulement dans le développement mobile, mais aussi pour les applications web (AngularDart) et les solutions serveur. Pour en savoir plus sur les capacités du langage, consultez la documentation officielle de Dart.

Points clés

  • Dart — le langage Flutter créé par Google, avec compilation JIT/AOT
  • Null safety — sound null safety depuis Dart 2.12 garantit l'absence d'erreurs null
  • Isolate — parallélisme via des threads isolés sans mémoire partagée
  • Flutter — framework UI qui rend les widgets via Skia/Impeller
  • Pub.dev — gestionnaire de paquets avec plus de 45 000 bibliothèques pour Dart et Flutter

Qu'est-ce que Dart ?

Dart est un langage de programmation à la syntaxe proche du C, développé par Google sous la direction de Lars Bak (créateur d'Eclipse). La première version est sortie en 2011, mais Dart a gagné en popularité en 2018 avec la sortie de Flutter 1.0. Le langage est conçu pour créer des interfaces utilisateur : il prend en charge nativement les streams, les futures et les patterns réactifs.

La philosophie de Dart est « l'équilibre entre performance et productivité ». Le langage prend en charge deux stratégies de compilation : JIT (Just-In-Time) pour le développement avec rechargement à chaud et AOT (Ahead-Of-Time) pour les builds de production avec des performances natives. Le compilateur JIT injecte du code modifié dans une application en cours d'exécution en millisecondes, sans nécessiter de recompilation de l'APK — c'est l'avantage clé de Dart par rapport aux autres langages dans le développement mobile.

Une fonctionnalité clé de Dart est sound null safety, introduite dans Dart 2.12 (2021). Le système de types garantit qu'une variable ne peut pas être null sans déclaration explicite (int?). Cela élimine NullPointerException à la compilation. Selon Google, l'adoption de null safety a réduit le taux de crash dans les applications Flutter de 30% en environnement de production.

Écosystème Dart

L'écosystème Dart comprend trois domaines principaux : Flutter (applications mobiles et desktop), AngularDart (applications web) et Dart Server (solutions serveur). Flutter est la plateforme dominante : selon Statista (2025), Flutter est utilisé dans 46% des projets mobiles multiplateformes, devant React Native (38%) et Xamarin (8%).

Syntaxe de Dart : types, fonctions et classes

La syntaxe de Dart ressemble à Java et JavaScript, mais possède ses propres constructions uniques. Tout dans Dart est un objet — même int, double et bool héritent d'Object. Le typage est facultatif : une variable déclarée comme var infère le type automatiquement, mais il est recommandé de spécifier les types explicitement pour la lisibilité et les performances.

Types et déclarations de base

Dart prend en charge int, double, String, bool, List, Set, Map, Record, Symbol et Runes. Type nullable — tout type avec le suffixe ? (int?, String?). L'opérateur ?? (null-aware) retourne la valeur de droite si celle de gauche est null. La notation en cascade (..) permet d'appeler plusieurs méthodes sur le même objet sans répéter la référence.

dart
// Types et déclarations de base dans Dart
void main() {
  // Typage explicite
  int age = 25;
  double price = 19.99;
  String name = 'Dart';
  bool isValid = true;

  // Null safety — la variable peut être null
  int? nullableAge = null;
  int result = nullableAge ?? 0; // Opérateur null-aware

  // Collections avec génériques
  List<String> items = ['Dart', 'Flutter', 'Mobile'];
  Map<String, dynamic> config = {
    'version': '3.0',
    'mode': 'debug',
  };

  // Notation en cascade
  final list = <String>[]
    ..add('one')
    ..add('two')
    ..sort();
}

// Record — type immuable anonyme
(String, int) user = ('Alice', 30);
print(user.$1); // 'Alice'

Le type dynamic désactive la vérification des types — utilisez-le uniquement lorsque vous travaillez avec JSON ou des données dynamiques. Record est un nouveau type dans Dart 3.0 qui permet de regrouper des valeurs sans créer de classe séparée. L'opérateur null-aware ?? est la méthode standard pour travailler avec des valeurs nullables, remplaçant les longues vérifications if-else.

Classes et mixins

Les classes dans Dart — héritage unique (extends), multiple via les mixins (mixin). Dart ne prend pas en charge les interfaces en tant que concept séparé — toute classe peut être implémentée (implements). Un mixin est une classe sans constructeur dont les méthodes et les champs peuvent être ajoutés à n'importe quelle classe en utilisant le mot-clé with.

dart
// Classes, héritage et mixins dans Dart
abstract class Animal {
  void sound(); // méthode abstraite
}

mixin Swimmer {
  void swim() => print('Swimming...');
}

mixin Flyer {
  void fly() => print('Flying...');
}

class Duck extends Animal with Swimmer, Flyer {
  @override
  void sound() => print('Quack!');
}

void main() {
  final duck = Duck();
  duck.sound(); // Quack!
  duck.swim();  // Swimming...
  duck.fly();   // Flying...
}

// Constructeur nommé
class Config {
  final String env;

  Config.development() : env = 'dev';
  Config.production()  : env = 'prod';
}

La classe Duck hérite de Animal et utilise deux mixins — Swimmer et Flyer. Cela démontre l'héritage multiple sans problème de losange : les mixins sont résolus linéairement (super chain). Les constructeurs nommés (Config.development) sont une alternative aux méthodes de fabrique statiques pour créer des objets avec des paramètres prédéfinis.

Asynchronie dans Dart : Future, Stream et async/await

L'asynchronie dans Dart est implémentée via Future (valeur unique), Stream (séquence de valeurs) et async/await. Dart utilise un modèle monotâche avec une boucle d'événements, similaire à JavaScript, mais avec une différence importante : les calculs longs ne bloquent pas l'UI car le code Dart s'exécute dans un Isolate — un thread séparé sans mémoire partagée.

Future représente une opération asynchrone qui se terminera après un certain temps. Un Future peut être en état d'attente, terminé avec une valeur ou terminé avec une erreur. La chaîne .then().catchError() est une alternative à async/await, mais il est recommandé d'utiliser await pour la lisibilité.

dart
// Chargement asynchrone de données avec Future et Stream
import 'dart:convert';
import 'package:http/http.dart' as http;

class ApiService {
  final String baseUrl;

  ApiService(this.baseUrl);

  // Future pour une seule requête
  Future<Map<String, dynamic>> fetchUser(int id) async {
    final response = await http.get(
      Uri.parse('$baseUrl/users/$id'),
    );

    if (response.statusCode == 200) {
      return jsonDecode(response.body);
    } else {
      throw Exception('Failed to load user: ${response.statusCode}');
    }
  }

  // Stream pour une séquence de données
  Stream<int> countStream(int max) async* {
    for (var i = 1; i <= max; i++) {
      await Future.delayed(Duration(seconds: 1));
      yield i;
    }
  }
}

void main() async {
  final api = ApiService('https://api.example.com');

  // Utilisation de await
  final user = await api.fetchUser(1);
  print('User: ${user['name']}');

  // Traitement de Stream avec await for
  await for (final count in api.countStream(5)) {
    print('Count: $count');
  }
}

La classe ApiService démontre deux types d'asynchronie : Future pour une requête HTTP (réponse unique) et Stream pour un compteur séquentiel (générateur avec async* et yield). Stream est efficace pour travailler avec les capteurs, la géolocalisation, Firebase Realtime Database — partout où les données arrivent en continu. Isolate utilise une mémoire séparée — les données sont transmises via SendPort/ReceivePort.

Dart et Flutter : architecture d'application

Dart et Flutter forment une pile unique : Flutter est le framework UI, Dart est le langage de description de l'UI. Dans Flutter, tout est un widget — d'un bouton à une application entière. Les widgets peuvent être stateful (avec état mutable) et stateless (immuables). Dart décrit une UI déclarative : build() retourne un arbre de widgets que Flutter rend avec Skia (ou Impeller sur iOS).

Structure d'une application Flutter

Une application Flutter en Dart consiste en main() → runApp(MyApp()) → MaterialApp. MaterialApp inclut le routage (routes), le thème (theme) et la localisation. Chaque écran est un Scaffold contenant AppBar, Body (généralement Column/ListView) et BottomNavigationBar. Navigation via Navigator.push/pop ou des routes nommées.

dart
// Application Flutter simple en Dart
import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Dart Demo',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatefulWidget {
  @override
  _HomeScreenState createState() => _HomeScreenState();
}

class _HomeScreenState extends State<HomeScreen> {
  int _counter = 0;

  void _increment() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text('Dart + Flutter')),
      body: Center(
        child: Text('Counter: $_counter'),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _increment,
        child: Icon(Icons.add),
      ),
    );
  }
}

Le widget HomeScreen est un StatefulWidget avec un état interne _counter. L'appel de setState() notifie à Flutter de reconstruire l'UI — le code Dart réexécute build(), créant un nouvel arbre de widgets. Flutter compare (diff) efficacement l'ancien et le nouvel arbre, mettant à jour uniquement les parties modifiées de l'écran. Hot Reload remplace build() sans réinitialiser l'état _counter.

Compilation de Dart : JIT vs AOT

La compilation de Dart est hybride : JIT pour le développement et AOT pour la production. En mode débogage, la Dart VM exécute un compilateur JIT qui interprète le bytecode avec la capacité d'échanger du code à chaud. En mode release, dart compile exe ou flutter build crée un binaire AOT natif pour une architecture spécifique (arm64, x86_64, armv7).

ModeCompilationVitesse d'exécutionTaille du binaireHot Reload
DebugJIT (VM)Moyenne~50 MoOui
ReleaseAOT (Natif)Maximale~15-20 MoNon
Webdart2jsDépend du navigateurVariableServeur dev

La compilation JIT de Dart en mode débogage offre un rechargement à chaud en ~1 seconde — les développeurs voient les changements d'UI sans perdre l'état de l'application. La compilation AOT offre des performances proches des applications natives Swift/Kotlin. Selon Google, Flutter sur Dart AOT atteint 60 FPS d'animations même sur des appareils de milieu de gamme.

Outils du développeur Dart

Les outils du développeur Dart incluent le Dart SDK (compilateur dart, dartanalyzer, dartfmt, pub), le Flutter SDK et les plugins IDE. Le Dart SDK est installé avec le Flutter SDK dans le dossier flutter/bin/cache/dart-sdk. Pub est le gestionnaire de paquets qui lit pubspec.yaml et télécharge les dépendances depuis pub.dev.

Outils clés

dart analyze — analyseur statique qui vérifie les types, les importations inutilisées et les erreurs potentielles. dart format — formateur qui formate automatiquement le code dans un style cohérent. dart doc — générateur de documentation à partir des commentaires ///. Flutter DevTools — profileur avec inspecteur d'arbre de widgets, logs, mémoire et réseau. Dart VM Service — débogage d'une application en cours d'exécution via WebSocket.

yaml
# pubspec.yaml — configuration du projet Dart
name: my_flutter_app
description: A new Flutter project.
version: 1.0.0

environment:
  sdk: '>=3.0.0 <4.0.0'

dependencies:
  flutter:
    sdk: flutter
  http: ^1.2.0
  provider: ^6.1.0
  shared_preferences: ^2.2.0
  json_annotation: ^4.8.0

dev_dependencies:
  flutter_test:
    sdk: flutter
  build_runner: ^2.4.0
  json_serializable: ^6.7.0
  flutter_lints: ^3.0.0

Le fichier pubspec.yaml décrit les dépendances d'un projet Dart. Le champ environment:sdk spécifie la version de Dart — la version stable actuelle est 3.x. Dependencies sont les bibliothèques principales, dev_dependencies sont pour les tests et la génération de code. json_annotation + json_serializable génèrent du code de sérialisation JSON via build_runner. flutter_lints est un ensemble de règles pour l'analyseur.

Questions fréquentes

Qu'est-ce que Dart ?

Dart est un langage de programmation de Google (2011), conçu pour le développement multiplateforme avec Flutter. Prend en charge la syntaxe proche du C, le typage fort, la compilation JIT et AOT. Se caractérise par sound null safety (depuis Dart 2.12) et l'asynchronie via Future et Stream. Utilisé pour les applications mobiles, web et desktop.

En quoi Dart diffère-t-il de JavaScript ?

Dart compile en code natif (AOT) ou JS (dart2js), JavaScript est interprété. Dart a un typage fort avec sound null safety, des classes intégrées et des mixins. L'asynchronie de Dart est basée sur Isolate (threads séparés sans mémoire partagée), JS — sur une boucle d'événements avec Web Workers. Les performances de Dart AOT sont 30 à 50 % supérieures à V8 JIT dans les scénarios mobiles.

Comment Dart compile-t-il en une application mobile ?

Dart compile AOT en code ARM natif via Dart Native. En mode débogage, la Dart VM utilise JIT avec rechargement à chaud. Le Flutter Engine (C++) rend l'UI via Skia/Impeller. Pour Android — flutter build apk, pour iOS — flutter build ios. La compilation web utilise dart2js ou dart2wasm. La taille de l'APK de release est de 15 à 20 Mo (sans division AAB).

Quels types de données Dart prend-il en charge ?

Dart prend en charge les primitifs : int, double, String, bool. Les collections : List, Set, Map, Record. Spéciaux : Symbol, Runes, Null. Tout est un objet, y compris les primitifs. Null safety : int? permet null, int n'est jamais null. Opérateurs ??, ??= pour la gestion sécurisée de null. Génériques : List<String>, Map<String, dynamic>.

Quels outils sont nécessaires pour le développement Dart ?

Flutter SDK inclut le Dart SDK, le Flutter Engine et la bibliothèque de widgets. IDE — Android Studio ou VS Code avec le plugin Flutter. DevTools — profileur avec inspecteur de widgets. Pub.dev — gestionnaire de paquets avec plus de 45 000 bibliothèques. Les outils dart analyze et dart format garantissent la qualité du code. Build_runner pour la génération de code de modèles JSON.

Résumé

  • Dart — le langage de Google pour Flutter, combinant développement JIT et performances AOT
  • Sound null safety depuis Dart 2.12 (+3.0) — protection obligatoire contre null au niveau des types
  • Asynchronie via Future (résultat unique), Stream (séquence), Isolate (parallélisme)
  • Flutter — framework UI déclaratif où tout est un widget (StatelessWidget / StatefulWidget)
  • Hot Reload — rechargement de code JIT en ~1 seconde sans perte d'état de l'application
  • Pub.dev — écosystème de paquets (plus de 45 000), géré via pubspec.yaml
  • Flutter DevTools — profileur avec inspecteur de widgets, mémoire et réseau

Nous développerons une application mobile clé en main

IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.

Discuter du projet

Lisez aussi