Dart 事件处理程序和 lambda



我对Dart的lambdas感到困惑。以这个工作示例为例:

void main() {
    print("Hello Dart!");
}

现在,如果我将其更改为:

import 'dart:html';
void main() {
    querySelector("#sample_text_id")
        ..onClick.listen((e) => fizz);
}
void fizz(MouseEvent mouseEvent, String s) {
    print("Hello $s!");
}

我没有收到任何语法错误,即使我将MouseEvent发送到需要 2 个参数的 (non0lambda) fizz方法!

  1. 为什么我没有收到任何编译/语法错误?
  2. 如何正确传递onClick.listen(...) fizz方法(换句话说,没有 lambda)?

在这种情况下,您实际上并没有将 fizz 作为事件处理程序传递。你是匿名函数:

(e) => fizz

是您作为事件处理程序传递的内容。在这种情况下,e 将是 Listen 期望的事件参数,而您只是丢弃它。然后你返回 fizz(一个函数),侦听器不会使用它,因为它期望 void。请记住,在飞镖中,函数是一等公民,可以传递甚至分配给变量。

要实现您想要的,您需要这样的东西:

import 'dart:html';
void main() {
  querySelector("#sample_text_id")
        ..onClick.listen(fizz);
}
void fizz(MouseEvent mouseEvent, String s) {
  print("Hello $s!");
}

当您传递一个需要太多参数的函数时,这应该会生成警告。这也可以通过将函数上的String s设置为可选来修复:

void fizz(MouseEvent event, [String s = "World"]) {
  print("Hello $s");
}

如果你的 fizz 具有预期的签名(例如,如 Matt 所示,使 s 可选),你可以直接传递该方法,而无需创建 lambda。

import 'dart:html';
void main() {
    querySelector("#sample_text_id")
        .onClick.listen(fizz);
}
void fizz(MouseEvent mouseEvent, [String s]) {
    print("Hello $s!");
}

提示:当您没有将更多调用链接到结果时,在 onClick 之前不需要两个点querySelector("#sample_text_id")

链接示例:

    querySelector("#sample_text_id")
        ..onClick.listen(fizz)
        ..onMouseOver.listen(fizz2);

相关内容

  • 没有找到相关文章

最新更新