web-dev-qa-db-fra.com

Dart lambda / confusion de la fonction shortland

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?

43
Jasper

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.

70
Daegalus

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;
}
40

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.

1
nonybrighto