为什么我不能在 dart 中声明这个局部变量?

问题描述 投票:0回答:1

为什么我不能在 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 lambda local-variables
1个回答
0
投票

在 Dart 中,您可以使用如下简写语法定义函数:

ReturnType functionName => expr;

与 JavaScript 不同,您不能在表达式两边加上大括号。如果这样做,该函数将返回一个集合,因为

{expr}
是定义集合文字的语法。这就是导致代码错误的原因。

您需要的是使用函数体语法,这是通过以下方式完成的:

onPointerSignal: (event)
{
  double dist = 0.0;
  if (event is PointerScrollEvent)
  // ...
}

与您的代码的区别只是删除了粗箭头语法(

=>
)。

© www.soinside.com 2019 - 2024. All rights reserved.