我对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)?答案 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")
链接示例:
querySelector("#sample_text_id")
..onClick.listen(fizz)
..onMouseOver.listen(fizz2);