我对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
方法!
- 为什么我没有收到任何编译/语法错误?
- 如何正确传递
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);