60

我对 Dart 还是很陌生,=>(胖箭头)的语法仍然让我感到困惑(我来自 C# 背景)。

因此,在 C# 中,胖箭头 ( => ) 表示:例如

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

action1("Some parameter");

意味着:任何作为参数发送到action1(如果可以转换为string进入 内部范围(在我们的例子中它只是打印在Debug.WriteLine()

但在 Dart 中有所不同.... (?)

例如在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 编辑器警告我,第一个和第二个print是:Expected string literal for map entry key. 我认为在 C# 方式中,str它只是为参数命名,该参数将由Future.then用于调用onValue或的内部回调填充onError

我做错了什么?

4

3 回答 3

109

您需要选择块语法或单一表达式语法,但不能同时选择两者。

您不能将 => 与 {} 结合使用

使用您的示例,您的两个选项如下:

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

或者

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

在这两种情况下,它只是表达匿名函数的一种方式。

通常,如果您只想运行一个表达式,您可以使用 => 语法来获得更简洁、更切题的代码。例子:

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

或者您可以使用带有花括号的块语法来完成更多工作,或者使用单个表达式。

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

但是从那时起您就无法将它们组合起来,您正在制作 2 个函数创建语法并且它会中断。

希望这可以帮助。

于 2013-04-04T06:49:21.817 回答
56

在 Dart=> xxx中只是一个要避免的语法糖{ return xxx; }。因此以下两个函数是等价的:

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

您还可以=>在方法定义上使用:

String myFunc(String s) => s;
String myFunc(String s) {
  return s;
}
于 2013-04-04T06:47:30.733 回答
3

该语法在 javascript 和 c# 等语言中运行良好,它支持(param1, param2, …, paramN) => { statements }语句用分号分隔。在 dart 中,粗箭头仅支持 . 的简写形式{ return expr; }
这解释了你的错误。带有大括号的代码(exp) => { print("Error occurred in class loading. Error is: $exp"); }意味着您正在返回一个映射,因此它希望看到类似于(param) => {"key": "value"}where key is a string literal 的内容。

于 2019-03-26T08:05:56.397 回答