7. Variables

Dans le précédent cours, nous avons vu l’écosystème du langage Dart et son fonctionnement, dans ce cours, nous allons voir la syntaxe du langage. Cette leçon n’est pas orientée pour les grands débutants, car elle passe rapidement sur le langage et sa syntaxe.

Dart est un langage C-like, si vous avez fait du Java, C# ou autre, vous ne devriez pas avoir de gros problèmes à vous adapter à Dart.

Si vous souhaitez programmer en Dart en suivant ces leçons sur le langage, n’hésitez pas à aller sur https://dartpad.dev/ (Pensez à écrire dans la fonction main)

Inférence de types

L’inférence de type permet au compilateur d’associer automatiquement des types aux variables quand ceux-ci ne sont pas déclarés explicitement. Par exemple, si vous écrivez :

Le compilateur va déduire que le type de la variable name d’après sa valeur, en l’occurrence un String. Vous pouvez vérifier le type d’une variable avec le mot-clé is ou la fonction runtimeType.

var name = 'Yoda';
if(name is String) {
 print(Name est un String);
}
print(name.runtimeType);

Typage

Chaque variable à un type défini, ce qui permet de limiter les erreurs lors du fonctionnement de l’application. Lors de sa première version, Dart avait un typage dynamique et il est aujourd’hui encore possible de programmer de cette façon avec le mot-clé dynamic . Aujourd’hui, il est recommandé d’éviter le plus possible les variables de type dynamic et de définir directement le type d’une variable.Pour déclarer une variable, on aura plusieurs possibilités.Vous pouvez préciser le type dès la création de la variable ou bien laisser la valeur définir son type.

Les deux variables ci-dessous seront des String peu importe comment elles sont déclarées.

String name = 'Yoda';
var name = 'Yoda';

Attention cependant à l’utilisation du mot-clé var, si on ne lui assigne pas une valeur au même moment de sa création, la variable sera de type dynamique tant qu’elle n’a pas de valeur associée. Et ce type changera à chaque changement de valeur.

var name;
print(name is dynamic); // true
name = 'yoda';
print(name.runtimeType); // String
name = 3;
print(name.runtimeType); // int

Null safety

Si vous ne connaissez pas le concept de null safety, il implique qu’une variable ne peut être nulle. Depuis quelques versions, Dart a implémenté les nullable, qui permettent à une variable d’être nulle.

Si vous déclarez une variable qui doit être potentiellement nulle, vous ajouterez un “?” au type de la variable.

String hello = 'Hello';
String? goodbye = 'I can be null';

L’utilisation de l’un ou l’autre dépendra notamment de votre besoin. Par exemple, si vous demandez dans un formulaire si l’utilisateur à des animaux, et que cette question est facultative, vous pouvez alors utiliser un booléen qui pourra avoir la valeur null, ou une de ses deux valeurs true/false.

Sans variable nullable, si on ne donne pas de valeur au bool à sa déclaration, le compilateur renverra une erreur.

bool hasAnimals;
print(hasAnimals); // Error

Il est alors recommandé de donner une valeur par défaut à la déclaration de la variable.

bool hasAnimals = false;
print(hasAnimals); // false

Si on souhaite que hasAnimals puisse être null, on rajoutera ? après le type.

bool? hasAnimals;
print(hasAnimals); // null

On pourra donc se permettre ce genre d’opérations :

bool? hasAnimals;<br>print(hasAnimals); // null
void saveValue(bool? hasAnimals) {
 if(hasAnimals == null) {
 print('Aucune réponse donnée'
 }
}

Les types primitifs et les objets peuvent être nullables,

Arbre des types

Dart Tree

Arbre des types nullables

Dart Nullable Tree

Dans ce cadre, Null en tant que type existe toujours, on le voit sur les deux images, cependant on voit qu’il n’est plus un sous type d’autres types.

C’est-à-dire que pour un String? ses sous types sont : String et Null.

String? name;
print(name.runtimeType); // null
print(name is String); // false
name = 'Liv';
print(name.runtimeType); // String
print(name is String); // true

Constantes & Final

const name = "Jean";
final age = 30;

Afin d’éviter de donner une nouvelle valeur à une variable, il est possible de créer une constante ou une final.

Une constante doit voir sa valeur assignée à sa création et ne pourra plus être modifiée ensuite, ça pourra vous servir par exemple pour noter des urls, des références à des assets…

Une final pour voir sa création dissociée de son assignation. Cependant, il ne sera pas possible de lui donner une nouvelle valeur une fois qu’elle en a une.

final name;
name = "Jean";
name = "Pierre"; // Erreur à la compilation

Imprimer dans la console

Si vous souhaitez imprimer des données dans la console de votre IDE ou dans DartPad, vous pouvez utiliser entre autre les éléments suivants :

var value = 'bonjour';
print(value);
log(value);

Print affichera au maximum 1024 characters dans la console, ce qui peut être suffisant pour beaucoup de cas. Si vous souhaitez afficher tout le contenu de votre variable, vous pouvez uitliser Log. Pour utiliser Log, il vous faudra importer une librairie supplémentaire.

Attention, ces messages s’imprimeront aussi si vous compilez en mode release votre projet, pour être sûr que vous ne diffusez pas des informations qui ne doivent pas être publiques, vous pouvez effectuer la méthode suivante :

void printer(String value) {
 if(kDebugMode) {
 print(value);
 }
}

Ainsi, vous limitez la fonction print à un environnement de développement.