La bibliothèque dart:core est la bibliothèque standard principale de Dart, importée implicitement et automatiquement. Elle fournit les fonctionnalités de base indispensables du langage. Voici ses fonctionnalités principales et des exemples de code classés par module.
Autrement dit, le développeur n’a pas besoin d’écrire d’instruction d’import ; elle se charge par défaut automatiquement.
I. Affichage console
Fonction de premier niveau print() : appelle automatiquement la méthode toString() de l’objet pour afficher du texte.
void main() {
var tea = "milk tea";
print(tea);
print('I drink $tea.');
}Langage du code : Dart (dart)
II. Types numériques : num / int / double
- Relation d’héritage :
intetdoublehéritent denum - Conversion chaîne vers nombre :
parse(); le type int accepte le paramètre radix pour préciser la base numérique - Conversion nombre vers chaîne :
toString(): conversion simpletoStringAsFixed(n): conserve n chiffres après la virguletoStringAsPrecision(n): n chiffres significatifs
void main() {
// Conversion chaîne vers nombre
assert(int.parse('42') == 42);
assert(int.parse('42', radix:16) == 66);
assert(double.parse('0.5') == 0.5);
// Conversion nombre vers chaîne
assert(123.456.toStringAsFixed(2) == '123.46');
assert(123.456.toStringAsPrecision(2) == '1.2e+2');
}Langage du code : Dart (dart)
III. Chaînes String & expressions régulières RegExp
- Les objets String sont immuables (toutes les méthodes de modification renvoient une nouvelle chaîne) ; ils stockent des unités de code UTF-16
- Méthodes courantes : recherche, extraction, découpage, mise en majuscules/minuscules, suppression des espaces
void main() {
var str = 'Never odd or even';
// Recherche
assert(str.contains('odd'));
assert(str.startsWith('Never'));
assert(str.endsWith('even'));
assert(str.indexOf('odd') == 6);
// Extraction et découpage
assert(str.substring(6,9) == 'odd');
var parts = 'a b c'.split(' ');
// Suppression espaces et vérification vide
assert(' abc '.trim() == 'abc');
assert(''.isEmpty);
assert(' '.isNotEmpty);
// Changement de casse
assert('dart'.toUpperCase() == 'DART');
// Privilégier StringBuffer pour concaténation (meilleure performance)
var sb = StringBuffer();
sb.write('Hello ');
sb.writeAll(['A','B','C'], ',');
print(sb.toString());
}Langage du code : Dart (dart)
Expressions régulières RegExp
void main() {
var reg = RegExp(r'\d+'); // Correspond à une suite de chiffres
var text = 'llamas live 15 to 20 years';
assert(reg.hasMatch(text));
// Parcours de toutes les correspondances globales
for(var m in reg.allMatches(text)){
print(m.group(0));
}
// Remplacement
var res = text.replaceAll(reg, 'XX');
print(res);
}Langage du code : Dart (dart)
Remarque : une unité de code ne correspond pas forcément à un caractère visible pour l’utilisateur. Pour les caractères Unicode complexes (combinaisons d’emojis), utilisez le paquet externe
characters.
IV. Collections (List / Set / Map)
1. List : ordonnée, accepte les doublons, accès par index
void main() {
var fruits = ['apple','orange'];
fruits.add('kiwi');
fruits.addAll(['grape']);
fruits.removeAt(0);
fruits.sort((a,b)=>a.compareTo(b)); // Tri des éléments
// Contrainte générique
var strList = <String>[];
}Langage du code : Dart (dart)
2. Set : non ordonnée, éléments uniques, pas d’accès par index
void main() {
var set = <String>{};
set.addAll(['gold','xenon']);
set.add('gold'); // Ajout d’un doublon sans effet
assert(set.contains('xenon'));
// Opération d’intersection
var set2 = Set.from(['xenon','argon']);
var inter = set.intersection(set2);
}Langage du code : Dart (dart)
3. Map : collection de paires clé-valeur ; les clés sont uniques
void main() {
var map = {54: 'xenon'};
print(map[54]);
assert(map.containsKey(54));
map.remove(54);
// Affecte seulement si la clé n’existe pas
map.putIfAbsent('name', () => 'Dart');
// Parcours des entrées
map.forEach((k,v)=>print('$k:$v'));
}Langage du code : Dart (dart)
4. Opérations génériques Iterable (List et Set implémentent Iterable)
Méthodes d’ordre supérieur habituelles : forEach, map, where, any, every
void main() {
var list = ['green','black','chamomile'];
list.forEach(print);
// map est évalué paresseusement, toList force l’exécution
var upperList = list.map((e)=>e.toUpperCase()).toList();
// Filtrer les éléments
var filter = list.where((e)=>e == 'chamomile');
assert(list.any((e)=>e == 'chamomile'));
assert(!list.every((e)=>e.contains('tea')));
}Langage du code : Dart (dart)
V. Gestion des URI (Uri)
Utilisé pour l’encodage, le décodage, l’analyse et la construction d’URL
encodeFull: encode uniquement les espaces et caractères similaires, conserve les symboles URL/ : ? &encodeComponent: échappe tous les caractères spéciaux (adapté pour encoder les valeurs des paramètres)
void main() {
// Analyser une url
var uri = Uri.parse('https://example.org:8080/foo?lang=dart#frag');
print(uri.scheme);
print(uri.host);
print(uri.queryParameters);
// Construire une url
var newUri = Uri.https('example.org','/foo', {'lang':'dart'});
}Langage du code : Dart (dart)
VI. Dates et heures DateTime & Duration
DateTime: instant temporel, prend en charge l’heure locale et l’UTCDuration: intervalle temporel, pour ajouter/soustraire des instants et calculer des écarts
void main() {
var now = DateTime.now();
var y2k = DateTime.utc(2000);
// Ajout et soustraction temporelle
var nextYear = y2k.add(const Duration(days:366));
var diff = nextYear.difference(y2k);
print(diff.inDays);
// Horodatage (millisecondes depuis l’époque Unix 1970-01-01 UTC)
print(y2k.millisecondsSinceEpoch);
}Langage du code : Dart (dart)
Attention : les décalages par jour peuvent entraîner des erreurs avec le changement d’heure été/hiver. Privilégiez l’heure UTC.
VII. Interfaces utiles et classes de base
1. Comparable : permet de comparer des objets pour le tri
class Line implements Comparable<Line> {
final int length;
const Line(this.length);
@override
int compareTo(Line other) => length - other.length;
}Langage du code : Dart (dart)
2. Clés personnalisées pour Map : redéfinir == et hashCode
Règle : des objets égaux doivent posséder le même hashCode
class Person {
final String first, last;
Person(this.first,this.last);
@override
int get hashCode => Object.hash(first, last);
@override
bool operator ==(Object other) =>
other is Person && other.first == first && other.last == other.last;
}Langage du code : Dart (dart)
- 3. Iterable + Iterator
Implémenter Iterable permet d’utiliser des boucles for-in avec une logique de parcours personnalisée.
VIII. Gestion des exceptions
- Error : erreur grave, généralement non interceptée (ex: NoSuchMethodError)
- Exception : anomalie prévisible pouvant être interceptée ; vous pouvez créer vos propres exceptions
class FooException implements Exception {
final String? msg;
const FooException([this.msg]);
@override
String toString() => msg ?? 'FooException';
}Langage du code : Dart (dart)
IX. Références faibles et finaliseurs
WeakReference: référence faible, n’empêche pas le ramasse-miettes de libérer l’objetFinalizer / NativeFinalizer: exécute un rappel quand l’objet est libéré, pour libérer des ressources nativesFinalizable: évite que l’objet soit collecté prématurément par le GC
Bibliothèque principale dart:core