作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
JSNI 方法不接受任何参数,但返回 Java 对象类型:
public static native String nativeJSFuncGwt() /*-{
$wnd.console.log($wnd.someJSFunc());
return "" + $wnd.someJSFunc() + "" ;
}-*/;
//someJSFunc returns { abc:xcv, def:asd}
我可以看到在 javascript 控制台中打印的值,但 java 端无法理解转换。
是不是因为native方法不接受任何参数?
String tokenFromNativeJS = nativeJSFuncGwt(); // String value is null
GWT 中的文档也不够清晰。
最佳答案
第一步,避免 JSNI,最好定义一个提供相同 API 访问的 JsInterop 方法。 JSNI 仍然可以在 GWT2 中使用,但 JsInterop 是 GWT3 的前进方向,并且通常更容易阅读和编写。这看起来像这样:
@JsMethod(name = "someJSFunc", namespace = JsPackage.GLOBAL)
public static native String someJSFunc();
第二步,定义一个符合您预期的 JS 返回值的 Java 类型。这将与 JSNI 或 JsInterop 一起使用。在 JSNI 中,您将创建一个 JavaScriptObject 子类,并提供访问字段的方法(有关更多详细信息,请参阅 http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html 和其他文档,但根据第一步,我不会在这里更深入地讨论这一点)。对于您的示例对象,这在 JsInterop 中看起来像这样:
@JsType(isNative = true, name = "Object", namespace = JsPackage.GLOBAL)
public class SomeReturnObject {
public String abc;
public double def;
}
显然,将字段名称和类型替换为适合您自己的项目的名称和类型。为这个新类型指定占位符名称,您的全局 someJsFunc 如下所示:
@JsMethod(name = "someJSFunc", namespace = JsPackage.GLOBAL)
public static native SomeReturnObject someJSFunc();
您将像在普通 Java 中一样使用它 - 不再需要编写 JSNI:
SomeReturnObject object = someJSFunc();
DomGlobal.console.log(object.abc + ": " + object.def);
关于java - 如何在 GWT JSNI 中将 JavaScript 的返回值转换为 Java?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57852600/
我是一名优秀的程序员,十分优秀!