#Les Types

On l’a vu, le mot-clef var permet l’inférence des types toutefois, il est possible de typer statiquement notre code grâce aux déclarations de type


#Types de base

TypeValeurs possiblesDescription
booltrue / falseun booléen
int42, 23817861, -1282un nombre entier
float42.10, -1,99, - 1,189821un nombre à virgule
string"valentin", 'Citation : "blablabla"', "42"une chaîne de caractères
NULLnullune valeur vide

#Chaîne de caractères

Une chaîne de caractère est de type String, il est possible d’échapper les caractères spéciaux avec \

String myString = "Valentin : \"Salut !\"" // Valentin : "Salut !"

Ainsi que de concaténé plusieurs chaînes de caractères :

String lastName = "Folliguet";
String firstName = "Valentin";
var age = 28;
  
print('$lastName $firstName a $age ans'); // Folliguet Valentin a 28 ans

print('$lastName$firstName'); // FolliguetValentin

print(lastName + firstName + age.toString()); // FolliguetValentin28

print('Hello ''World!'); // Hello World!

print(lastName += firstName); // FolliguetValentin

#Les nombres entiers

On déclare un nombre entier avec le mot clef int

int meaningOfLife = 42;
var number = 1; // type inference (int)

On peut utiliser la méthode toString() pour transformer un entier en chaîne de caractère

String numberToString = number.toString(); // "1"

#Les nombres décimaux

Le type double caractérise les nombres décimaux

double myDoubleNumber = 12.5;

Il est bon de savoir que les types int et double hérite d’une classe mère num, pour number. Un type générique qui accepte les deux. Vous utiliserez dans 99% des cas les type int ou double pour typer vos variables, car bien plus précis !

En d’autres termes, il est possible de faire ça :

num integerNum = 1;
num doubleNum = 1.5;

#Le booléen

Le booléen représente un type de donnée true ou false on le déclare avec le mot clef bool

bool isStudentSleeping = true;
bool isStudentAwake = false;

#Le dynamic

Le type dynamic représente une valeur dynamique, yes, c’est bien vous suivez ! Cette valeur évoluera tout au long du cycle de vie de l’application, on déclare une variable dynamique avec le mot clef dynamic

dynamic age = 28;

age = 28.5;
age = "thirty"
age = false

Fortement déconseillé ! L’utilisation à outrance du type dynamic ne permet plus à votre code d’être type safe 🙃

En d’autres termes, merci de respecter le langage que vous utilisez, allez faire du JS si vous n’êtes pas content !


#Les listes

Le type List<> représente une liste de valeurs ordonnées selon des index. On déclare une liste en entourant les valeurs de [], ailleurs on parle de tableaux. Voici un exemple basique :

List<int> numberList = [1, 2, 3, 4, 5];

List<String> stringList = ["Un", "Deux", "Trois", "Quatre", "Cinq"];

List<dynamic> dynamicList = [1, "Deux", 3, "Quatre", 5];

Récupération de la taille de notre liste

List<String> userList = ["Henri", "Max", "Alban"];

print(userList.length); // 3

Récupération d’un élément spécifique selon son index

List<String> userList = ["Henri", "Max", "Alban"];

print(stringList[1]); // Max

Réassignation d’un élément selon son index

List<String> userList = ["Henri", "Max", "Alban"]; 
userList[1] = "Valentin";

print(userList); // [Henri, Valentin, Alban]; 

Rajout d’un élément à la fin de notre liste

List<String> userList = ["Henri", "Valentin", "Alban"]; 
userList.add("Anthony");

print(userList); // [Henri, Valentin, Alban, Anthony]; 

Suppression d’un élément selon son index

List<String> userList = ["Henri", "Valentin", "Alban", "Anthony"];
userList.removeAt(1);

print(userList); // [Henri, Alban, Anthony];

Ajout d’un élément à un index spécifique

List<String> userList = ["Henri", "Alban", "Anthony"];
userList.insert(1, "Valentin");

print(userList); // [Henri, Valentin, Alban, Anthony];

Ajout d’une liste à la fin d’une autre liste

List<String> userList = ["Henri", "Valentin", "Alban", "Anthony"];
var otherUserList = ["William", "Jérémy"];

userList.addAll(otherUserList); 

print(userList); // [Henri, Valentin, Alban, Anthony, William, Jérémy];

Vérification de la présence d’un élément dans notre liste

List<String> userList = ["Henri", "Valentin", "Alban", "Anthony"];
bool hasElement = userList.contains("Valentin");

print(hasElement); // true

#Les MAP

Contrairement à une liste, on ordonne les données par clef-valeur et on le déclare avec des accolades {}

Map<int, String> employeeNameMap = {
    1: "Valentin",
    7: "Alban",
    12: "Henri",
    17: "William"
}

print(employeeNameMap); // {1: Valentin, 7: Alban, 12: Henri, 17: William}

Vous êtes libres de définir le type des clefs et des valeurs à l’intérieur de votre map

Map<String, dynamic> employeeMap = {
    "valentin": {
      "age": 28,
      "job": "teacher",
      "isFantastic": true
    },
    "henri": {
      "age": 120,
      "job": "teacher",
      "isFantastic": true
    }    
};

print(employeeMap); // {valentin: {age: 28, job: teacher, isFantastic: true}, henri: {age: 120, job: teacher, isFantastic: true}}

Ça ressemble drôlement à du JSON 🧐

Récupération de la taille du map

print(employeeMap.length); // 2

Ajout d’un élément

employeeMap["alban"] = {
    "age": 26,
    "job": "teacher",
    "isFantastic": true
};

print(employeeMap); // {valentin: {age: 28, job: teacher, isFantastic: true}, henri: {age: 120, job: teacher, isFantastic: true}, alban: {age: 26, job: teacher, isFantastic: true}}

Suppression d’un élément

employeeMap.remove("Valentin")

print(employeeMap); // {henri: {age: 120, job: teacher, isFantastic: true}, alban: {age: 26, job: teacher, isFantastic: true}}

Suppression de tout les éléments

employeeMap.clear();

print(employeeMap); // {}

Vérification de la présence d’éléments

print(employeeMap.isEmpty); // true

#Null safety / Optionnel

Afin d’éviter de longues sessions de débogages, une erreur de compilation se produira si vous essayez d’accéder à une variable qui a pour valeur null

String firstName;
print(firstName); // Non-nullable variable 'lastName' must be assigned before it can be used.

Si malgré tout, vous voulez autoriser une variable comme potentiellement null on suffixera son type avec l’opérateur ?

String? nullableFirstName;
print(firstName); // null

#Future

La classe Future représente une valeur potentielle, ou une erreur, qui sera disponible à un moment donné dans le futur. Elle fait partie de la bibliothèque de base de Dart et est essentielle pour gérer les opérations asynchrones. En l’utilisant correctement, vous pouvez exécuter des tâches de longue durée sans bloquer l’UI de votre application, offrant ainsi une expérience fluide à l’utilisateur.

Les opérations asynchrones permettent à votre programme de continuer à s’exécuter sans attendre que les longues tâches se terminent, ce qui est crucial pour maintenir une interface utilisateur réactive dans vos applications.

#Opérations asynchrones

Il s’agit d’opérations qui prennent un certain temps pour se terminer, telles que la lecture d’un fichier, une requête réseau, les requêtes de base de données ou toute autre opération qui dépend de facteurs externes qui ne sont pas immédiatement disponibles.