gpt4 book ai didi

dart - 将从 javascript API 返回的 javascript 对象转换为 dart 类

转载 作者:行者123 更新时间:2023-12-01 01:57:50 25 4
gpt4 key购买 nike

我正在尝试使用来自 https://pub.dartlang.org/packages/js 的 js 包创建 auth0 javascript API 的 dart 实现。 .
所以我正在加载 https://cdn.auth0.com/js/lock/10.0.0/lock.min.js在 index.html 中,我创建了以下 auth0lock dart 类:

@JS()
library auth0lock;

import 'package:js/js.dart';

@JS('Auth0Lock')
class Auth0LockJS {
external factory Auth0LockJS(String token, String domain, Object options);
external on(String event, Function func);
external show();
}

class Auth0Lock {
Auth0LockJS auth0;
Auth0Lock(String token, String domain, Object options) {
this.auth0 = new Auth0LockJS(token,domain,options);
}
on(String event, Function func) {
this.auth0.on(event,allowInterop(func));
}
show() {
this.auth0.show();
}
}

@anonymous
@JS()
class AuthResult {
external factory AuthResult({
String accessToken,
String idToken,
String idTokenPayload,
String state
});
external String get accessToken;
external set accessToken(String v);
external String get idToken;
external set idToken(String v);
external Object get idTokenPayload;
external set idTokenPayload(Object v);
external String get state;
external set state(String v);
}
我正在编写一个 angular2-dart 应用程序,因此我创建了一个使用 auth0lock.dart 的身份验证服务。我之前使用以下代码显示的文件:
@Injectable()
class Auth {
Auth0Lock lock;

authenticatedEvent(AuthResult authResult) {
print(authResult);
}

Auth() {
this.lock = new Auth0Lock(configObj.auth0.apiKey, configObj.auth0.domain,{});
this.lock.on("authenticated", authenticatedEvent);
}
updateProfileName(data) {
var profile = data['profile'] != null ? data['profile'] : data;
print(profile['name']);
}

authenticated() {
return false;
}

login() {
this.lock.show();
}
}
现在……一切正常!我创建于 auth_service.dart归档变量类型 AuthLock命名 lock .我的实例是带参数的,运行 show()功能,连接到 authenticated事件并在身份验证完成时触发该函数。
我创建了一个 AuthResult 类,但它忽略了它,我得到了一个从函数处理程序返回的 javascript 对象。
我使用 Intellij 编写代码并使用 dartium 执行。所以当我在 print(authResult); 上放置断点时行在 auth_service.dart文件中,调试器显示 authResult 对象包含 2 个属性, JavaScript View类型 Objectclass类型 JSObjectimpl . Javascript View包含此函数处理程序返回的所有属性。
如何将其转换为 dart 中的常规类(class)?显然我错误地创建了 AuthResult 类,因为函数处理程序不返回这种类型。那我错过了什么?
谢谢!
更新
authenticatedEvent我尝试打印的功能 authResult.values ,这产生了 JSObjectImpl 类型的类没有该功能的错误。所以返回对象是类型 JSObjectImpl .奇怪的是我不知道在哪里 JSObjectImpl已定义,所以我删除了 authResult 的变量类型并尝试使用以下代码在目录中使用变量:
authenticatedEvent(authResult) {
var a = authResult.accessToken;
print(a);
}
这有效。为什么我找不到 JSObjectImpl输入 Dart ?有什么快速的方法可以把它转换成 Dart 课?
谢谢

最佳答案

也许你只需要删除 @anonymous来自 AuthResult
一个简化但完整且相似的示例

index.html

<!doctype html>
<html>
<head>
<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';
};

function callback(f) {
console.log(f);
f(new Apple('Golden Delicious'));
}
</script>
</head>
<body>
<script type="application/dart" src="index.dart"></script>
<script src="packages/browser/dart.js"></script>
</body>
</html>

index.dart
@JS()
library typed_callback.web;

import 'package:js/js.dart';

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

typedef void Callback(Apple a);

@JS('callback')
external void callback(Callback /* or just Function */ f);

f(Apple apple) {
print(apple.getInfo());
print(apple); // prints the stringified JS object [object Object]
}

main() async {
callback(allowInterop(f));
}

关于dart - 将从 javascript API 返回的 javascript 对象转换为 dart 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39010376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com