【问题标题】:Expose Dart functions to javascript向 javascript 公开 Dart 函数
【发布时间】:2013-03-18 03:25:39
【问题描述】:

我对飞镖有点陌生,并试图通过在其中编写一些库函数来弄湿我的脚。

虽然我从 dart 调用 javascript 函数没有问题,但我希望能够从 javascript 调用 dart 函数,但到目前为止,我还不太喜欢。

例如,我希望能够从 dart 中公开一些基本功能,例如:

main() {
  String foo() {
    return "bar!";
  }

  js.scoped(() {
    js.context.foo = foo;
  });
}

然后可以从 javascript 中调用它们,如下所示:

<script>
  window.onload = function() {
    alert("foo() = " + foo());
  }
</script>

这样的事情可能吗?

【问题讨论】:

标签: dart dart-js-interop


【解决方案1】:

没问题!见Calling Dart from JavaScript

在你的情况下:

import 'dart:js' as js;
main() {
  String foo() {
    return "bar!";
  }

  js.context['foo'] = foo;
}

【讨论】:

  • 突然间,它不起作用:声称“'Proxy'中没有这样的设置器'foo'” ...
  • yes :) js 的第一次更新到 0.19 仍然无法正常工作。重新启动编辑和第二次更新后,我得到了 0.20,一切都很好。再次感谢!
  • 在链接文档“Calling Dart from JavaScript”中没有提到回调。它被删除了吗?
  • 是的,答案已经过时了。
  • 现在推荐的方式是什么?
【解决方案2】:

在 Dart 1.20 中,我必须添加 allowInterop()

import 'dart:js' as js;
main() {
  String foo() {
    return "bar!";
  }

  js.context['foo'] = allowInterop(foo);
}

【讨论】:

  • 这在原生 dart (dartium) 中运行良好,但在 js 编译版本(chrome、ff、ie..)中运行良好。请检查此screenshot。当我删除 allowInterop 时,它甚至可以在 js 编译版本中使用。我正在使用 Dart 1.19.1。这是 1.20 中修复的东西吗?
  • 似乎在 Chrome 和 Dartium 中为我工作。我会再次检查并报告。
  • 再次检查,我可以确认它在 Dartium 和 Chrome 中工作。
  • 感谢您的验证。我试图创建空的示例聚合物项目,仅包含上面屏幕截图中的代码,并且使用 allowInterop 对我不起作用(在 Dartium 中有效,但在 IE、FF、Chrome 中无效)。我已经在多台计算机上的多个浏览器中进行了测试。如果您愿意,可以自行测试:data.itpro.cz/dart_allowinterop。当你在 Chrome 中按 F12 并输入: foo() 你会得到一个错误,如果你输入 foo2() 它会写 "bar2!"
【解决方案3】:

在 Dart 2.3.0 中,我不得不稍微调整一下解决方案,让 allowInterop 发挥得很好。


    import 'dart:js' as js;
    main() {
      String foo() {
        return "bar!";
      }

      js.context['foo'] = js.allowInterop(foo);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-16
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多