飞镖事件处理程序和lambda

时间:2013-12-23 12:53:04

标签: html lambda event-handling dart

我对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)?

2 个答案:

答案 0 :(得分:2)

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

(e) => fizz

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

要达到你想要的效果,你需要这样的东西:

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

答案 1 :(得分:1)

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

import 'dart:html';

void main() {
    querySelector("#sample_text_id")
        .onClick.listen(fizz);
}

void fizz(MouseEvent mouseEvent, [String s]) {
    print("Hello $s!");
}

提示:当你没有将更多的调用链接到querySelector("#sample_text_id")

的结果时,你在onClick之前不需要两个点

链接示例:

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