передача объекта в конструктор виджета, определенного в uibinder - PullRequest
5 голосов
/ 16 октября 2010

Я пытаюсь передать EventBus моего приложения в виджет, объявленный в UiBinder через его конструктор. Я использую аннотацию @UiConstructor, чтобы отметить конструктор, принимающий EventBus, но я не знаю, как на самом деле ссылаться на объект из моего кода ui.xml.

То есть мне нужно что-то вроде

WidgetThatNeedsAnEventBus.java

public class WidgetThatNeedsAnEventBus extends Composite
{
    private EventBus eventBus;

    @UiConstructor
    public WidgetThatNeedsAnEventBus(EventBus eventBus)
    {
        this.eventBus = eventBus;
    }
}

TheUiBinderThatWillDeclareAWTNAEB.ui.xml

<g:HTMLPanel>
    <c:WidgetThatNeedsAnEventBus eventBus=_I_need_some_way_to_specify_my_apps_event_bus_ />
</g:HTMLPanel>

У меня нет проблем с передачей статического значения в WidgetThatNeedsAnEventBus, и я могу использовать фабричный метод для создания нового объекта EventBus. Но мне нужно передать уже существующий EventBus моего приложения.

Есть ли способ ссылаться на уже существующие объекты в UiBinder?

Ответы [ 2 ]

8 голосов
/ 27 октября 2010

Мое возможное решение было использовать @UiField(provided=true) на виджете, который мне нужно было инициализировать с помощью переменной.

Затем я сам сконструировал виджет на Java, прежде чем вызвать initWidget для родителя.

Например:

public class ParentWidget extends Composite
{
    @UiField(provided=true)
    protected ChildWidget child;

    public ParentWidget(Object theObjectIWantToPass)
    {
        child = new ChildWidget(theObjectIWantToPass);  //_before_ initWidget
        initWidget(uiBinder.create(this));

        //proceed with normal initialization!
    }
}
2 голосов
/ 16 октября 2010

Я бы предложил вам использовать фабричный метод (описанный здесь ).Таким образом, вы можете передать экземпляр в ваш виджет.

С помощью элемента <ui:with> вы также можете передавать объекты в виджеты (при условии, что существует метод установки) (как описано здесь ).Но объект будет создан с помощью GWT.create, который, я думаю, был не тот, который вы намеревались сделать с eventBus.

...