我正在try 在DART中注册CustomEvent(https://developer.mozilla.org/en-US/docs/DOM/Event/CustomEvent).这方面的旧代码是:

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

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

推荐答案

其 idea 是自定义事件的声明和使用方式与内置事件相同.

因此,对于定制活动,您可以按照以下方式进行操作:

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);
}

Dart相关问答推荐

从GTIN中提取GS1公司前缀

Dartpad使用基本身份验证发出请求

有什么区别!并且 ! 在 Dart 中?

当未指定返回类型时,dart 显示另一个函数内部的确切返回类型,但对于顶层函数显示为动态

使用 2 个类型参数声明类型StateNotifierProvider,但给出了 1 个类型参数

Flutter:Firebase FieldValue.serverTimestamp() 到 DateTime 对象

如何在 Flutter/dart 中获取一周中特定日期的日期?

如何在 Flutter DropDown 按钮中搜索

判断无状态小部件是否在Flatter中处理

无法导入 dart 的 intl 包

未定义命名参数child.在 Center() 构造函数中

如何在dart列表中找到一个元素

如何在抽象类中声明工厂构造函数?

如何将 3 字节的 unicode 字符写为字符串文字

在 Dart 中升序和降序排序?

Dart:Iterable 与 List,总是使用 Iterable?

我应该更喜欢迭代 Map.entries 还是 Map.values?

使用 Dart 将 Uint8List 转换为字符串

Dart 脚本会在浏览器中本地运行吗?

如何在 Dart 中连接两个字符串?