为什么我不能在 lambda 函数内声明局部变量?
我有这个代码:
@override
Widget build(BuildContext context)
{
return new Expanded(
child: new Listener(
onPointerSignal: (event) =>
{
double dist = 0.0; // Why does that not compile?
if (event is PointerScrollEvent)
{
dist = event.scrollDelta.dy,
onDrag(context, event.localPosition, dist.toInt(), true)
}
},
child: // .....
))
};
我可以直接在
dist
方法中声明变量build
,然后代码就可以编译。这与 lambda 方法显然不能包含语句而只能包含表达式这一事实有关吗?看来使用 ;
来分隔 lambda 内的语句也是非法的。不过我似乎找不到相关规范。
我在
double dist...
线上收到三个错误消息:“预期找到 ','”、“未定义名称 'dist'” 和“预期找到 '}'”。
在 Dart 中,您可以使用如下简写语法定义函数:
ReturnType functionName => expr;
与 JavaScript 不同,您不能在表达式两边加上大括号。如果这样做,该函数将返回一个集合,因为
{expr}
是定义集合文字的语法。这就是导致代码错误的原因。
您需要的是使用函数体语法,这是通过以下方式完成的:
onPointerSignal: (event)
{
double dist = 0.0;
if (event is PointerScrollEvent)
// ...
}
与您的代码的区别只是删除了粗箭头语法(
=>
)。