É simples ouvir um evento em um elemento personalizado no Polymer:
<my-element on-buttonclicked='{{doAction}}'></my-element>
E my-element.dart :
clicked(Event e) {
e.preventDefault();
dispatchEvent(new CustomEvent('buttonclicked', detail: { 'this': 'that', 'and': 'this' });
}
Em seguida, no arquivo code-behind:
doAction(Event e, var detail, Node target) {
...
}
Mas o que acontecerá se seu code-behind estiver em outro lugar na hierarquia DOM e você adicionar my-element programaticamente? Você não pode vincular usando um atributo, então a primeira coisa que você tenta é:
var element = new Element.tag('my-element');
document.body.append(element);
element.addEventListener('buttonclicked', doAction);
Não vá, estou com medo. Você precisa importar dart: async e usar um EventStreamProvider assim:
static const EventStreamProvider<CustomEvent> buttonClickedEvent =
const EventStreamProvider<CustomEvent>("buttonclicked");
Stream<CustomEvent> get onButtonClicked => MyElement.buttonClickedEvent.forTarget(this);
Em seguida, anexar seu evento ao seu elemento torna-se um caso de:
var element = new Element.tag('my-element');
document.body.append(element);
element.onButtonClicked.listen((e) => doAction(e));