如何使用 dart:js 将选项传递给 javascript 函数?
How to pass options to javascript function using dart:js?
我有以下功能 javascript 代码来演示我想要实现的目标。它应该输出传递给方法的对象,然后是 属性 "a".
的值
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<script>
window.theObjectCall = function(x) {
console.log(x);
console.log(x.a);
}
</script>
<script src="main.dart.js" type="application/javascript"></script>
</body>
</html>
我有以下 dart 代码,它可以工作,但“a”无法像我预期的那样访问。
@JS('window')
library whatever;
import 'dart:js';
import 'package:js/js.dart';
@JS('theObjectCall') // Accessing method getCurrentPosition from Geolocation API
external void theJsObjectCall(JsObject theObject);
void someJsCallWithObject() {
var object = JsObject(context['Object']);
object['a'] = 'xxx';
theJsObjectCall(object);
}
在控制台中执行以下“未定义”日志。
您应该单独定义您的对象,如下例所示。原因是 javascript 对包括 JSObject
在内的 classes 是不透明的。正如文档所建议的那样,它只是您访问 Dart 中的 js 对象属性的代理。不知道你能不能用
然而,如果您已经知道要传递的对象的结构,那么您可以使用该结构定义一个匿名 class 并将定义的 JS 函数传递给它。然后 dart2js 将适当地处理转换。
@JS('window')
library whatever;
import 'dart:js';
import 'package:js/js.dart';
import 'package:flutter/material.dart';
@JS('theObjectCall') // Accessing method getCurrentPosition from Geolocation API
external void theJsObjectCall(ObjectYouWantToSend theObject);
void someJsCallWithObject() {
ObjectYouWantToSend oywts = ObjectYouWantToSend(a: 'xyz');
theJsObjectCall(oywts);
}
@JS()
@anonymous
class ObjectYouWantToSend {
external factory ObjectYouWantToSend({
String a,
});
external String get a;
}
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Container(
child: Center(
child: FlatButton(
onPressed: someJsCallWithObject,
child: Text('Call The js Function.'),
),
),
),
),
);
}
}
您可以在我的 repo 中找到代码。
这是部署后的样子。
我有以下功能 javascript 代码来演示我想要实现的目标。它应该输出传递给方法的对象,然后是 属性 "a".
的值<!DOCTYPE html>
<html>
<head>
</head>
<body>
<script>
window.theObjectCall = function(x) {
console.log(x);
console.log(x.a);
}
</script>
<script src="main.dart.js" type="application/javascript"></script>
</body>
</html>
我有以下 dart 代码,它可以工作,但“a”无法像我预期的那样访问。
@JS('window')
library whatever;
import 'dart:js';
import 'package:js/js.dart';
@JS('theObjectCall') // Accessing method getCurrentPosition from Geolocation API
external void theJsObjectCall(JsObject theObject);
void someJsCallWithObject() {
var object = JsObject(context['Object']);
object['a'] = 'xxx';
theJsObjectCall(object);
}
在控制台中执行以下“未定义”日志。
您应该单独定义您的对象,如下例所示。原因是 javascript 对包括 JSObject
在内的 classes 是不透明的。正如文档所建议的那样,它只是您访问 Dart 中的 js 对象属性的代理。不知道你能不能用
然而,如果您已经知道要传递的对象的结构,那么您可以使用该结构定义一个匿名 class 并将定义的 JS 函数传递给它。然后 dart2js 将适当地处理转换。
@JS('window')
library whatever;
import 'dart:js';
import 'package:js/js.dart';
import 'package:flutter/material.dart';
@JS('theObjectCall') // Accessing method getCurrentPosition from Geolocation API
external void theJsObjectCall(ObjectYouWantToSend theObject);
void someJsCallWithObject() {
ObjectYouWantToSend oywts = ObjectYouWantToSend(a: 'xyz');
theJsObjectCall(oywts);
}
@JS()
@anonymous
class ObjectYouWantToSend {
external factory ObjectYouWantToSend({
String a,
});
external String get a;
}
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Container(
child: Center(
child: FlatButton(
onPressed: someJsCallWithObject,
child: Text('Call The js Function.'),
),
),
),
),
);
}
}
您可以在我的 repo 中找到代码。
这是部署后的样子。