2013-12-23 96 views
1

我很困惑Dart的lambda。就拿這個工作示例:飛鏢事件處理程序和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到( non0lambda)fizz需要2個參數的方法!

  1. 爲什麼我沒有收到任何編譯/語法錯誤?
  2. 如何正確通過onClick.listen(...)fizz方法(換句話說,沒有lambda)?

回答

2

在這種情況下,你實際上並沒有像事件處理程序那樣傳遞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"); 
} 
1

如果你的香味有預期的簽名(如化妝運動自選馬特顯示),你可以直接通過該方法,而無需創建一個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);