Dart lambda/shortland function confusion

Dart

Dart Problem Overview


I'm still pretty new to Dart and the syntax of => (fat arrow) still confuses me (I come from C# background).

So in C# fat arrow ( => ) says: goes to so for example:

Action<string> action1 = (str) => { System.Diagnostic.Debug.WriteLine("Parameter received: " + str.ToString()); }

action1("Some parameter");

means: whatever send as parameter to action1 (if it could be casted to string) goes to inner scope (in our case it just printed in Debug.WriteLine()

but in Dart it's something different.... (?)

for example in 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"); }
);

Dart editor warn me that the first and second print is: Expected string literal for map entry key. I think in C# way that str it just name for parameter that will be filled by internal callback that Future.then uses to call onValue or onError

What I'm doing wrong ?

Dart Solutions


Solution 1 - Dart

You need to choose either block syntax or single expression syntax, but not both.

You can't combine => with {}

Your two options are as follows using your example:

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")
);

or

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"); }
);

In both cases, it is just a way to express an anonymous function.

Normally if you want to just run a single expression, you use the => syntax for cleaner and more to the point code. Example:

someFunction.then( (String str) => print(str) );

or you can use a block syntax with curly braces to do more work, or a single expression.

someFunction.then( (String str) {
  str = str + "Hello World";
  print(str);
});

but you can't combine them since then you are making 2 function creation syntaxes and it breaks.

Hope this helps.

Solution 2 - Dart

In Dart => xxx is just a syntaxic sugar to avoid { return xxx; }. Thus the two following functions are equivalent :

var a = (String s) => s;
var b = (String s) { return s; } ;

You can also use => on method definitions :

String myFunc(String s) => s;
String myFunc(String s) {
  return s;
}

Solution 3 - Dart

That syntax works well in a language like javascript and also c# where it supports (param1, param2, …, paramN) => { statements } with statement being separated with semi colon. In dart, the fat arrow only supports expression which is shorthand for { return expr; }.
That explains your Error. Your code with the curly brace (exp) => { print("Error occurred in class loading. Error is: $exp"); } means you are returning a map, so it expects to see something like (param) => {"key": "value"} where key is a string literal.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAlex FView Question on Stackoverflow
Solution 1 - DartDaegalusView Answer on Stackoverflow
Solution 2 - DartAlexandre ArdhuinView Answer on Stackoverflow
Solution 3 - DartnonybrightoView Answer on Stackoverflow