当我运行chrome扩展程序的dart2js
编译版本时,出现以下问题:
Uncaught TypeError: Object #<JsObject> has no method 'where$1'
我创建了一个最小的示例:
background.dart
import 'dart:js';
void main() {
print("main()...");
context['js_list'] = new JsObject.jsify(["aaa", "bbb"]);
}
popup.dart
import 'dart:js';
var backgroundPage = context["chrome"]["extension"].callMethod("getBackgroundPage", []);
void main() {
print("main():...");
testJsList(backgroundPage['js_list']);
}
testJsList(List<String> jsList) {
print("testJsList(): jsList = $jsList");
print("testJsList(): ['aaa', 'bbb'] = ${new JsObject.jsify(['aaa', 'bbb'])}");
jsList.where((e) => e == "bbb").forEach(print);
}
在Chromium(Dartium)上运行时:
main():...
testJsList(): jsList = [aaa, bbb]
testJsList(): ['aaa', 'bbb'] = [aaa, bbb]
bbb
在Chrome(dart2js-> V8)上运行时:
main():...
testJsList(): jsList = aaa,bbb
testJsList(): ['aaa', 'bbb'] = [aaa, bbb]
Uncaught TypeError: Object #<JsObject> has no method 'where$1'
显然,Dart VM对JS Interop的处理与已编译的javascript略有不同。
jsList
的打印方式有所不同,在第二种情况下为“错误”类型的“jsList”。更新:
看来问题是由三重奏{dart:js,dart2js,chrome API}引起的,因为临时创建的JsObject在Dartium和dart2js方案中均正常工作。
最佳答案
Dartium和dart2js各自具有各自的dart:js实现,但它们的行为应相同。在这种情况下,它看起来像是dart2js实现中的错误,因为JsObject.jsify
应该返回实现JsArray
的List
,但是错误指出它正在返回简单的JsObject
。
您可以在dartbug.com上提交错误吗?
关于dart - 构建Chrome扩展程序时,Dartium和dart2js之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21976257/