如何使用新的流 API 在 Dart 中注册自定义事件

2024-04-25

我正在尝试注册 CustomEvent (https://developer.mozilla.org/en-US/docs/DOM/Event/CustomEvent https://developer.mozilla.org/en-US/docs/DOM/Event/CustomEvent)在达特中。旧的代码是:

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

新的 Streams API 改变了您注册事件的方式。如何使用新 API 注册 CustomEvents?


这个想法是自定义事件的声明和使用方式与内置事件相同。

因此,对于自定义事件,您需要执行以下操作:

class DataGenerator {
   static EventStreamProvider<Event> dataEvent = new EventStreamProvider('data');
}

然后在元素上收听:

DataGenerator.dataEvent.forTarget(element).listen(...);

一旦支持元素子类化并且事件通常直接在其元素上触发,并且事件子类化允许自定义事件使用更有用的事件类型,这将变得更清晰。

我们讨论了保留window.on['foo'].listen(...)API,但试图阻止字符串访问器,因为对于某些事件,我们将它们填充为不同的事件名称。

这是一个更完整的示例:

import "dart:html";

DivElement dartDiv;

main() {
  dartDiv = query("#dartDiv");

  // Add a button to generate a CustomEvent called CustomDartEvent.
  var customEventStreamProvider = new EventStreamProvider<CustomEvent>("CustomDartEvent");
  var customEventButton = new ButtonElement()
    ..text = "Generate custom Dart event"
    ..classes.add("gwt-Button")  // For consistency
    ..onClick.listen((e) {
      var detail = {
        "n": 8,
        "s": "Hello from Dart",
        "obj": {
          "hello": "from Dart"          
        }
      };  
      var event = new CustomEvent("CustomDartEvent",
          canBubble: false, cancelable: false, detail: detail);
      window.dispatchEvent(event);
    });
  dartDiv.children.add(customEventButton);

  // Listen for CustomEvents called CustomDartEvent.
  customEventStreamProvider.forTarget(window).listen((e) {
    printString("""
      Received CustomDartEvent:
      type: ${e.type},
      detail: ${e.detail}
    """);
  });
}

void printString(String s) {
  var div = new DivElement()
    ..text = s;
  dartDiv.children.add(div);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用新的流 API 在 Dart 中注册自定义事件 的相关文章

随机推荐