See the note about castability in the javadoc: https://javadoc.io/doc/com.google.jsinterop/jsinterop-annotations/latest/jsinterop/annotations/JsType.html
Rule of thumb is: use a class only if it maps to a "constructor" in JS, i.e. something you'll either create an instance of, or use in an "instanceof" check; for everything else (generally something you get from another API or "receive" in a callback), use an interface.
In this case, I think you could also use name="Object".
On Monday, January 13, 2025 at 7:47:28 AM UTC+1 ma...@craig-mitchell.com wrote:
Overlay types do work, and make it a little better:public class CrazyGamesUser extends JavaScriptObject {
protected CrazyGamesUser() {}
public final native String getUserName() /*-{ return this.username; }-*/;
public final native String getProfilePictureUrl() /*-{ return this.profilePictureUrl; }-*/;
}However, it would be great if JsInterop just worked, so I could just do:@JsType(isNative = true, namespace = JsPackage.GLOBAL)
public static class CrazyGamesUser {
public String username;
public String profilePictureUrl;
}Maybe I'm missing something?On Monday, 13 January 2025 at 4:02:40 pm UTC+11 Craig Mitchell wrote:I'm calling some existing JS that returns a JS Object which I've implemented in JsInterop:@JsType(isNative = true, namespace = "window.CrazyGames.SDK")
public static class JsUser {
public native Promise<CrazyGamesUser> getUser();
}I can happily call it:sdk.user.getUser()
.then(user -> {
// Do something with the user
return null;
})
.catch_(error -> {
return null;
});This issue is I'm struggling to work out how to define the return object "CrazyGamesUser". The actual JS object is just this:{
"username": "SingingCheese.TLNU",
"profilePictureUrl": "https://images.crazygames.com/userportal/avatars/4.png"
}If I define it like this:@JsType(isNative = true, namespace = JsPackage.GLOBAL)
public static class CrazyGamesUser {
public String username;
public String profilePictureUrl;
}I get a java.lang.ClassCastException.So if I set the name to "?":@JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL)
public static class CrazyGamesUser {
public String username;
public String profilePictureUrl;
}Then I get a compile error:'?' can only be used as a name for native interfaces in the global namespace.But if I make it an interface, I can't have the member variables.If I do remove the member variables, it does work, and I can access them via some JSNI:public static native String getUsername(CrazyGamesUser instance) /*-{
return instance.username;
}-*/;But that's really ugly. What's the correct approach here?Thanks.
You received this message because you are subscribed to the Google Groups "GWT Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to google-web-toolkit+unsubscribe@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/google-web-toolkit/f51ee1f0-6254-4b6a-b2b2-50dc9935b993n%40googlegroups.com.
No comments:
Post a Comment