Chaque fichier Dart est intrinsèquement une bibliothèque, même sans écrire la directive library ;
Règle de confidentialité : Les identifiants commençant par le tiret bas _ sont privés à la bibliothèque, visibles uniquement au sein de cette dernière, inaccessibles entre fichiers/bibliothèques différents ;
Il n’existe pas de mots-clés public/protected/private ; les droits d’accès sont distingués exclusivement par le tiret bas ;
Les bibliothèques peuvent être empaquetées sous forme de package et gérées via pub ;
Avantage : Permet le Tree Shaking (élagage d’arbre) pour supprimer le code mort inutilisé.
import
Utilisez le mot-clé import pour importer d’autres bibliothèques.
import sert à charger les API d’autres bibliothèques
Trois types d’URI :
dart:xxx: Bibliothèques standard natives de Dart (dart:core,dart:async,dart:js_interop)package:xxx: Bibliothèques tierces gérées par pub- Chemins de fichier relatifs : Fichiers
.dartpersonnalisés locaux
// Bibliothèques standard natives
import 'dart:js_interop';
import 'dart:math';
// Paquets tiers
import 'package:test/test.dart';
// Bibliothèque de fichier local
import './utils.dart';Langage du code : JavaScript (javascript)
Alias de bibliothèque
Lorsque deux bibliothèques possèdent des classes/fonctions de même nom, utilisez as alias pour les isoler et éviter les conflits.
Exemple
Dans lib1.dart
class Element {}Langage du code : JavaScript (javascript)
lib2.dart contient la même classe
class Element {}Langage du code : JavaScript (javascript)
Fichier principal main.dart
// Import direct, espace de noms par défaut
import 'lib1.dart';
// Attribuer l’alias lib2
import 'lib2.dart' as lib2;
void main() {
Element e1 = Element(); // Element issu de lib1
lib2.Element e2 = lib2.Element(); // Element issu de lib2
}Langage du code : JavaScript (javascript)
Pour éviter toute confusion, nous donnons l’alias lib2 à lib2.dart : il suffit de préfixer toutes ses classes par cet alias pour y accéder.
Import sélectif show / hide
show : Importer uniquement les noms indiqués, masquer tout le reste
// Seul foo est importé, les autres variables/classes sont indisponibles
import 'lib1.dart' show foo;
void main() {
foo();
// bar(); // Erreur, non importé via show, inaccessible
}Langage du code : JavaScript (javascript)
hide : Importer tout, masquer uniquement les noms spécifiés
// Importer l’intégralité, bloquer uniquement foo
import 'lib2.dart' hide foo;
void main() {
bar();
// foo(); // Erreur, masqué par hide
}Langage du code : JavaScript (javascript)
Chargement différé deferred as
Valide uniquement sur la plateforme Web
- Réduire la taille de chargement initial de la page web ;
- Destiné aux popups peu utilisées, pages optionnelles ;
- Télécharger dynamiquement des fragments de code à la demande.
- Syntaxe d’import :
import chemin deferred as espaceDeNoms - Appeler
espaceDeNoms.loadLibrary()renvoie un Future, utilisezawaitpour attendre la fin du chargement - Plusieurs appels à
loadLibrary()pour une même bibliothèque ne déclenchent qu’un seul chargement - Limitation : Les constantes et types présents dans la bibliothèque différée ne peuvent pas être utilisés directement avant chargement
Exemple complet
hello.dart (bibliothèque à chargement différé)
void printGreeting() {
print("Hello from deferred library wellcome to foxdevelop.com");
}
Langage du code : JavaScript (javascript)
main.dart
// Import différé, alias hello
import 'hello.dart' deferred as hello;
Future<void> greet() async {
// Charger la bibliothèque dynamiquement
await hello.loadLibrary();
// On ne peut appeler les méthodes internes qu’après chargement terminé
hello.printGreeting();
}
void main() async {
await greet();
}
Langage du code : JavaScript (javascript)
Résultat d’exécution :
Hello from deferred library wellcome to foxdevelop.com
Langage du code : JavaScript (javascript)
Placer les deux fichiers dans le même dossier

Si hello.dart se trouve dans un autre répertoire, par exemple le dossier lib du niveau supérieur ?
Exemple de chemin : D:\dartdemo\firstdart\lib
Le fichier main.dart est situé dans D:\dartdemo\firstdart\bin
firstdart/
├─ bin/
│ └─ firstdart.dart // Point d’entrée du programme
└─ lib/
└─ hello.dart // Bibliothèque à chargement différéLangage du code : JavaScript (javascript)
L’import s’écrit alors comme ceci
// ../ représente le répertoire parent
import '../lib/hello.dart' deferred as hello;Langage du code : JavaScript (javascript)
Déclaration de bibliothèque en tête de fichier library
Écrite tout en haut du fichier, sert à ajouter des commentaires de documentation de bibliothèque et des annotations au niveau de la bibliothèque (ex: restriction de plateforme de test).
/// Bibliothèque d’outils de test exclusive pour navigateur
@TestOn('browser')
library;
Langage du code : JavaScript (javascript)
export
Exporter (encapsuler une API publique unifiée)
Souvent utilisé pour concevoir des paquets d’outils : regroupe plusieurs sous-bibliothèques et n’expose qu’un seul point d’import externe.
Structure de fichiers
src/math.dart
int add(int a, int b) => a + b;
int sub(int a, int b) => a - b;
Langage du code : PHP (php)
src/string.dart
String upper(String s) => s.toUpperCase();
Langage du code : JavaScript (javascript)
utils.dart (point d’export unifié)
export 'src/math.dart';
export 'src/string.dart';
// Masquer les outils internes privés
export 'src/internal.dart' hide helper;
Langage du code : JavaScript (javascript)
utils.dart ne peut pas être exécuté seul : c’est uniquement un fichier de regroupement des exports, il ne contient pas de fonction d’entrée main(), on ne peut pas lancer dart run lib/utils.dart ;
Rôle de export
- Regrouper les API de plusieurs sous-fichiers src ;
- L’utilisateur n’a qu’à importer le seul fichier
utils.dartpour accéder à toutes les méthodes exposées ; hide xxxmasque les outils internes, encapsule les détails d’implémentation et maîtrise les API exposées au public.
Utilisation dans main.dart
import 'utils.dart';
void main() {
print(add(1,2));
print(upper("dart"));
}
Langage du code : JavaScript (javascript)
Attention
export/importne gèrent que l’import/export au niveau du code source ; si vous distribuez des fichiers sources.dart, les tiers peuvent consulter l’intégralité du code source ;Pour masquer le code source, vous devez ne pas publier les fichiers
.dartsources, ne distribuer que des instantanés binaires compilés (Snapshot).Un Snapshot est un fichier binaire compilé par Dart : il est impossible de le reconstituer complètement en code source lisible, on ne peut appeler que les API exposées.
Ce sujet est abordé dans d’autres cours.
part
Diviser une seule bibliothèque en plusieurs fichiers
Séparer une même bibliothèque sur plusieurs fichiers qui partagent les identifiants privés à tiret bas. Il faut associer obligatoirement part 'xxx.dart' et part of 'fichier_principal.dart'
main_lib.dart (fichier principal de bibliothèque)
library; // Déclarer que ce fichier est une bibliothèque
part 'logic.dart'; // Fusionner logic.dart avec le fichier actuel, ils appartiennent à la même bibliothèque
int _secret = 999; // Variable privée de la bibliothèque
Langage du code : JavaScript (javascript)
logic.dart (fichier fragmenté)
part of 'main_lib.dart'; // Déclarer que ce fichier appartient à main_lib.dart, ce n’est pas une bibliothèque indépendante.
void printSecret() {
// Peut accéder à _secret du fichier principal, les éléments privés d’une même bibliothèque se partagent mutuellement
print(_secret);
}
Langage du code : JavaScript (javascript)
Appel
import 'main_lib.dart'; // Importer la bibliothèque principale, PAS les fichiers fragmentés
void main() {
printSecret(); // Affiche 999
}
Langage du code : JavaScript (javascript)
Imports conditionnels
Basculer automatiquement les fichiers d’implémentation selon la plateforme d’exécution
import 'platform_stub.dart'
if (dart.library.io) 'platform_mobile.dart'
if (dart.library.js_interop) 'platform_web.dart';
Langage du code : JavaScript (javascript)