Я ломал голову над этим большую часть двух дней. Я прочитал документацию по JSNI здесь, а также несколько других блогов публикации в JSNI и передача переменных, таких как эта и ничто не указывает на то, что я делаю что-то не так. По сути, то, что я пытаюсь сделать, это вызвать из моего класса на стороне клиента GWT метод javascript, который я экспортирую в javascript по мере загрузки моего класса. Этот метод берет параметры из другого метода JS и сохраняет их в экземпляре класса Java, который я передал. Кажется, это работает. Но как только я ссылаюсь на эти методы в своем java-коде, они становятся неопределенными. Я считаю, что происходит то, что мой экземпляр класса Java каким-то образом теряется после завершения JS. Вот некоторый код, который поможет объяснить рабочий процесс...
У меня есть класс Java с именем ProfileWidgee. Этот класс имеет метод для установки локальных переменных для местоположения, широты и долготы. Имя этого метода...
public void handleTargetPicked(String mloc, String mlat, String mlng) {
loc = mloc.equalsIgnoreCase("undefined") ? "" : mloc;
lat = mlat.equalsIgnoreCase("undefined") ? "" : mlat;
lng = mlng.equalsIgnoreCase("undefined") ? "" : mlng;
Window.alert("setting on js side" + loc + lat + lng);
}
Этот метод экспортируется в JS как функция с использованием метода JSNI с именем exportMyFunction...
public static native void exportMyFunction(ProfileWidgee instance)/*-{
$wnd.handleTargetPicked = $entry(
[email protected]::handleTargetPicked(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;));
}-*/;
Кажется, все идет хорошо. Он экспортируется, и я могу вызвать handleTargetPicked в своем JS следующим образом...
handleTargetPicked(encodeURIComponent(place.formatted_address),
encodeURIComponent(place.geometry.location.lat()),
encodeURIComponent(place.geometry.location.lng()));
Все это работает, и Window.alert() отображает правильные значения. Это заставляет меня поверить, что у него есть соответствующий экземпляр моего класса и что он правильно устанавливает переменные. Однако позже, когда я вернулся в свой класс Java, я пытаюсь ссылаться на эти переменные, и они всегда возвращаются как «неопределенные».
Window.alert("reading on the java side" + pw.getLoc() + pw.getLat() + pw.getLng());
Это приводит к «неопределенному» для всех трех значений. Итак, мой большой вопрос: можно ли установить значение в вашем классе Java со стороны JS, а затем использовать это значение позже в вашем классе?