Je suis encore assez nouveau pour Dart et la syntaxe de => (grosse flèche) me confond toujours (je viens de l'arrière-plan C #).
Donc, en C #, la grosse flèche (=>) dit: va à donc par exemple:
Action<string> action1 = (str) => { System.Diagnostic.Debug.WriteLine("Parameter received: " + str.ToString()); }
action1("Some parameter");
signifie: quel que soit le paramètre envoyé à action1
(s'il peut être converti en string
) va à portée interne (dans notre cas, il vient d'être imprimé dans la fonction Debug.WriteLine()
mais à Dart c'est quelque chose de différent .... (?)
par exemple dans Future.then
ClassWithFutures myClass = new ClassWithFutures();
myClass.loadedFuture.then(
(str) => { print("Class was loaded with info: $str"),
onError: (exp) => { print("Error occurred in class loading. Error is: $exp"); }
);
L'éditeur de fléchettes m'avertit que le premier et le deuxième print
sont: Expected string literal for map entry key
. Je pense en C # que str
il suffit de nommer le paramètre qui sera rempli par le rappel interne que Future.then
Utilise pour appeler onValue
ou onError
Qu'est-ce que je fais mal?
Vous devez choisir la syntaxe de bloc ou la syntaxe d'expression unique, mais pas les deux.
Vous ne pouvez pas combiner => avec {}
Vos deux options sont les suivantes en utilisant votre exemple:
ClassWithFutures myClass = new ClassWithFutures();
myClass.loadedFuture.then(
(str) => print("Class was loaded with info: $str"),
onErrro: (exp) => print("Error occurred in class loading. Error is: $exp")
);
ou
ClassWithFutures myClass = new ClassWithFutures();
myClass.loadedFuture.then(
(str) { print("Class was loaded with info: $str"); },
onErrro: (exp) { print("Error occurred in class loading. Error is: $exp"); }
);
Dans les deux cas, c'est juste un moyen d'exprimer une fonction anonyme.
Normalement, si vous souhaitez simplement exécuter une seule expression, vous utilisez la syntaxe => pour plus de netteté et plus pour le code de point. Exemple:
someFunction.then( (String str) => print(str) );
ou vous pouvez utiliser une syntaxe de bloc avec des accolades pour faire plus de travail, ou une seule expression.
someFunction.then( (String str) {
str = str + "Hello World";
print(str);
});
mais vous ne pouvez pas les combiner puisque vous créez 2 syntaxes de création de fonction et ça casse.
J'espère que cela t'aides.
Dans Dart => xxx
n'est qu'un sucre syntaxique à éviter { return xxx; }
. Ainsi, les deux fonctions suivantes sont équivalentes:
var a = (String s) => s;
var b = (String s) { return s; } ;
Vous pouvez aussi utiliser =>
sur les définitions des méthodes:
String myFunc(String s) => s;
String myFunc(String s) {
return s;
}
Cette syntaxe fonctionne bien dans un langage comme javascript et également c # où elle prend en charge (param1, param2, …, paramN) => { statements }
avec instruction séparée par un point-virgule. Dans Dart, la grosse flèche ne prend en charge que l'expression qui est un raccourci pour { return expr; }
.
Cela explique votre erreur. Votre code avec l'accolade bouclée (exp) => { print("Error occurred in class loading. Error is: $exp"); }
signifie que vous renvoyez une carte, elle s'attend donc à voir quelque chose comme (param) => {"key": "value"}
où clé est un littéral de chaîne.