¿Cómo escucho los eventos personalizados en Dart?

Quiero hacer algo como

// WARNING: this code does not work, it's illustrative
query("#myBtn").onClick.listen((e) {
  window.fire["foo"];
});

window.on["foo"].listen((e) => print("foo was here"));

window.on["foo"].listen((e) => print("and here"));

¿Es posible? ¿Cómo? He estado buscando en Google durante algunas horas, pero soy un poco nuevo para la programación en general, por lo que no conozco ninguna palabra clave para este tipo de cosas.

¡Gracias! :)

- EDITAR: resuelto -

Aquí es cómo pasar argumentos a lo largo (el editor se quejará, pero funciona)

List<String> myData = ["one","two"];

query("#myBtn").onClick.listen((e) {
  window.on["foo"].dispatch(new CustomEvent("foo", canBubble: false, cancelable: false, detail: myData));
});

window.on["foo"].add((e) => print( e.detail[1] ));

:-)

Respuestas a la pregunta(2)

Su respuesta a la pregunta