如何使用新的 js 0.6.0 包将 Dart 类映射到 JS“类”?

Posted

技术标签:

【中文标题】如何使用新的 js 0.6.0 包将 Dart 类映射到 JS“类”?【英文标题】:How to map a Dart class to a JS "class" with the new js 0.6.0 package? 【发布时间】:2016-01-15 02:32:00 【问题描述】:

index.html

<!doctype html>
<html>
  <head>
  </head>
    <script>
      var Apple = function(type) 
        this.type = type;
        this.color = "red";
      ;

      Apple.prototype.getInfo = function() 
        return this.color + ' ' + this.type + ' apple';
      ;
    </script>
  <body>
    <script type="application/dart" src="index.dart"></script>
    <script src="packages/browser/dart.js"></script>
  </body>
</html>

index.dart

import 'dart:js' as js;
import 'dart:html' as dom;
import 'package:js/js.dart';

main() 
  // this works fine
  var apple = new js.JsObject(js.context['Apple'], ['Macintosh']);
  print(apple.callMethod('getInfo', []));
  print(new Apple().getInfo());


@Js() // about to being changed to @JS
class Apple 
  external String get type;
  external set type(String type);
  external String get color;
  external set color(String color);
  external factory Apple(String type);

只需添加@Js() 注释即可

异常:“dart:js”:断言失败:第 393 行:“p.isNamed”不正确。 天文台收听http://127.0.0.1:35293/ 内部错误:Dart_Invoke 需要加载库参数“target”。

更新 删除 external factory Apple(String type); 可修复异常。

现在我明白了

天文台收听http://127.0.0.1:38029/ 红色 Macintosh 苹果 例外:“Apple”类没有实例方法“getInfo”。

NoSuchMethodError:找不到方法:'getInfo' 接收方:“Apple”实例 论据:[...] Apple.getInfo 主要的

【问题讨论】:

【参考方案1】:

该类需要一个构造函数声明但没有factory

用这个 JS

<script>
  var Apple = function(type) 
    this.type = type;
    this.color = "red";
    this.getInfo2 = function() 
      return this.color + ' ' + this.type + ' apple';
    ;
  ;

  Apple.prototype.getInfo = function() 
    return this.color + ' ' + this.type + ' apple';
  ;
</script>

还有这个 Dart 代码

main() 
  var apple = new js.JsObject(js.context['Apple'], ['Macintosh']);
  print(apple.callMethod('getInfo', []));
  print(new Apple('Macintosh').type);
  print(new Apple('Macintosh').getInfo2());
  print(new Apple('Macintosh').getInfo());


@Js() // about to being changed to @JS
class Apple 
  external String get type;
  external set type(String type);
  external String get color;
  external set color(String color);
  external String getInfo();
  external String getInfo2();
  external Apple(String type);

它按预期工作。

【讨论】:

以上是关于如何使用新的 js 0.6.0 包将 Dart 类映射到 JS“类”?的主要内容,如果未能解决你的问题,请参考以下文章

使用具有列表类型参数的 dart 类,如何使其具有等价性

如何在不创建新的 dart 项目的情况下运行与我的颤振项目隔离的 dart 代码?

使用 node.js 和 Sharp 包将非裁剪调整为 png

如何在单元测试中访问 Dart 类

dart2js 代码如何比 javascript 更快?

如何从 Javascript 调用 Dart 函数?