Bibliothèque de base dart:core

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

  1. Relation d’héritage : int et double héritent de num
  2. Conversion chaîne vers nombre : parse() ; le type int accepte le paramètre radix pour préciser la base numérique
  3. Conversion nombre vers chaîne :
  • toString() : conversion simple
  • toStringAsFixed(n) : conserve n chiffres après la virgule
  • toStringAsPrecision(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

  1. encodeFull : encode uniquement les espaces et caractères similaires, conserve les symboles URL / : ? &
  2. 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’UTC
  • Duration : 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’objet
  • Finalizer / NativeFinalizer : exécute un rappel quand l’objet est libéré, pour libérer des ressources natives
  • Finalizable : évite que l’objet soit collecté prématurément par le GC

Bibliothèque principale dart:core

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *