2010-10-15 11 views
5

Estoy tratando de pasar el EventBus de mi aplicación a un widget declarado en un UiBinder a través de su constructor. Estoy usando la anotación @UiConstructor para marcar un constructor que acepta EventBus, pero no sé cómo hacer referencia al objeto desde mi código ui.xml.pasando un objeto al constructor de un widget definido en uibinder

Es decir, necesito algo así como

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> 

no tengo ningún problema de pasar a un valor estático el WidgetThatNeedsAnEventBus, y puedo usar un método de fábrica para crear un nuevo objeto EventBus. Pero lo que necesito es pasar el EventBus ya existente de mi aplicación.

¿Hay alguna manera de referirse a objetos ya existentes en un UiBinder?

Respuesta

8

Mi solución final fue utilizar @UiField(provided=true) en el widget que necesitaba para inicializar con una variable.

Luego, acabo de construir el widget en Java, antes de llamar al initWidget en el elemento principal.

Por ejemplo:

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

Le sugiero que utilice un método de fábrica (descrito here). De esta manera puede pasar una instancia a su widget.

Con el elemento <ui:with> también puede pasar objetos a widgets (siempre que exista un método setter) (como se documentó en here). Pero el objeto se creará una instancia a través del GWT.create, que creo que no era la intención de hacerlo con el eventBus.

+0

también un buen ejemplo para los métodos de fábrica: http://blog.jeffdouglas.com/2010/02/24/gwt-uibinder-passing-objects-to-widgets/ – z00bs

+0

No quiero instanciar un nuevo objeto, ya que parece que un método de fábrica requeriría. Aquí hay un ejemplo diferente: digamos que tengo un String llamado myString, y en un archivo ui.xml tengo un declarado. ¿Cómo puedo especificar a ese que debe usar el constructor Label (String) y pasar el valor de myString a ese constructor? @UiField (provided = true) parece prometedor, pero no puedo ver cómo pasar myString a un constructor. Quizás esto no es posible con UiBinder? –

+2

Al pasar una cadena: cree y anote el constructor de su clase ui con 'UiConstructor' y en el archivo ui.xml defina un atributo con exactamente el mismo nombre que el argumento de los constructores. 'public @UiConstructor MyWidget (String myString)' y ''. – z00bs

Cuestiones relacionadas