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
| Type | Valeurs possibles | Description |
|---|---|---|
| bool | true / false | un booléen |
| int | 42, 23817861, -1282 | un nombre entier |
| float | 42.10, -1,99, - 1,189821 | un nombre à virgule |
| string | "valentin", 'Citation : "blablabla"', "42" | une chaîne de caractères |
| NULL | null | une valeur vide |
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
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"
Le type double caractérise les nombres décimaux
double myDoubleNumber = 12.5;
Il est bon de savoir que les types
intetdoublehérite d’une classe mèrenum, pour number. Un type générique qui accepte les deux. Vous utiliserez dans 99% des cas les typeintoudoublepour 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 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 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
dynamicne 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 !
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
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
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
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.
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.