2010-10-15 2 views
5

Sto provando a passare l'EventBus della mia app a un widget dichiarato in un UiBinder tramite il suo costruttore. Sto usando l'annotazione @UiConstructor per contrassegnare un costruttore che accetta l'EventBus, ma non so come fare effettivamente riferimento all'oggetto dal mio codice ui.xml.passando un oggetto al costruttore di un widget definito in uibinder

Cioè, ho bisogno di qualcosa come

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> 

Non ho alcun problema passando un valore statico per the WidgetThatNeedsAnEventBus e posso usare un metodo factory per creare un nuovo oggetto EventBus. Ma quello di cui ho bisogno è passare l'EventBus già esistente della mia app.

C'è un modo per fare riferimento a oggetti già esistenti in un UiBinder?

risposta

8

La mia soluzione finale era usare @UiField(provided=true) sul widget che avevo bisogno di inizializzare con una variabile.

Quindi, ho appena creato il widget da solo in Java, prima di chiamare initWidget sul genitore.

Ad esempio:

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

Suggerirei di utilizzare un metodo di fabbrica (descritto here). In questo modo puoi passare un'istanza al tuo widget.

Con l'elemento <ui:with> è anche possibile passare oggetti ai widget (a condizione che esista un metodo setter) (come documentato here). Ma l'oggetto verrà istanziato tramite GWT.create che penso non fosse che intendete fare con lo eventBus.

+0

anche un buon esempio per i metodi di fabbrica: http://blog.jeffdouglas.com/2010/02/24/gwt-uibinder-passing-objects-to-widgets/ – z00bs

+0

Non voglio creare un'istanza di un nuovo oggetto, in quanto sembra richiedere un metodo di fabbrica. Ecco un esempio diverso: diciamo che ho una stringa chiamata myString e in un file ui.xml ho dichiarato . Come posso specificare a quello che dovrebbe utilizzare il costruttore Label (String) e passare il valore di myString a quel costruttore? @UiField (provided = true) sembra promettente, ma non riesco a vedere come passare myString a un costruttore. Forse questo non è possibile con UiBinder? –

+2

Passare una stringa: crea e annota il costruttore della tua classe ui con 'UiConstructor' e nel file ui.xml definisci un attributo con esattamente lo stesso nome dell'argomento dei costruttori. 'public @UiConstructor MyWidget (String myString)' e ''. – z00bs