[Dart] Déclarer un paramètre de type callback, avec les types.
par
, 05/07/2021 à 11h08 (2875 Affichages)
Ce billet se base sur la version 2.13.3 du langage Dart.
Le langage Dart étant un langage de typage statique, il serait bien dommage de ne pas en profiter pour l'ensemble des signatures de fonction que l'on utilise.
Cependant, lorsque l'on a besoin de déclarer un callback (en variable d'instance de classe par exemple), la tâche n'est pas forcément simple. Si bien que souvent l'on écrit simplement :
Evidemment, avec cette fonction, rien ne nous interdit de passer un paramètre, de retourner un type différent de celui attendu ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Function onReady;
Admettons par exemple que la fonction onReady, si l'on s'en réfère à la déclaration classique, soit la suivante (En ne prêtant guère attention aux nombreuses mauvaises pratiques de celles-ci, telle que l'utilisation d'entier au lieu d'une énumération. C'est juste pour illustrer rapidement le concept dont je veux vous parler.) :
Si l'on se contente de la déclaration précédente, rien ne nous interdit d'ommettre le paramètre attendu eventType, ou de passer un 2e paramètre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 bool onReady(int eventType) { if (eventType == 3) return false; return true; }
En fait on peut déclarer la signature de la fonction onReady de la manière suivante :
Voici un example complet d'utilisation :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 bool Function(int eventType) statusHandler;
Et cela fonctionne aussi avec la fonctionnalité null-safety (la fonctionnalité de Dart qui vérifie si un type de variable peut ou non accepter la valeur null):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 bool Function(int eventType) statusHandlerbool onReady(int eventType) { if (eventType == 3) return false; return true; } void printStatus(bool Function(int eventType) statusHandler, int eventType) { print(statusHandler(eventType)); } void main () { printStatus(onReady, 3); }
Ainsi j'ai pu utiliser cette fonction en paramètre de constructeur dans un Widget Flutter d'un projet personnel.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 final void Function(int index)? handleHistoryItemRequested;
On constate donc que cette fonction peut prendre une valeur concrête, aussi bien que prendre null (grâce au point interrogation suivant la parenthèse de fermeture). Et cela fonctionne aussi pour les paramètres de la fonction, ainsi que le type de retour.
Voilà, j'espère que vous aurez pris plaisir à lire ce billet![]()