2013-02-13 101 views
1

我有以下情況。我的UI表單上有兩個組合,一個顯示蔬菜列表,另一個顯示水果列表。GWT @UiFactory和參數化返回類型

在我的支持視圖類,我想宣佈這樣的方法:

@UiFactory 
SimpleComboBox<Vegetable> createVegetablesCombo() { 
    return vegetables; 
} 

@UiFactory 
SimpleComboBox<Fruit> createFruitsCombo() { 
    return fruits; 
} 

但似乎GWT不能識別參數返回類型......每次我得到一個錯誤:

ERROR: Duplicate factory in class VegetablesAndFruitsView for type SimpleComboBox. 

可以處理這種情況嗎?一個UI表單上有多個組合框的好例子嗎?

回答

3

在運行時從Java(而不是GWT,不是UiBinder,但是Java語言本身)角度看,SimpleComboBox<Vegetable>SimpleComboBox<Fruit>之間沒有區別。也就是說,這個錯誤來自UiBinder的代碼生成,它正在尋找所有@UiConstructor方法,並使用它們來構建事物。

那麼UiBinder有什麼作用?從UiBinder XML中,沒有泛型。 UiBinder得到這個權利的唯一方法就是如果你碰巧在你的課堂中包含了一個@UiField條目和適當的泛型。然後這可能需要@UiField註釋,可能會出現像這樣的含糊之處,這是GWT目前沒有做到的。

你在這方面想達到什麼目的?您正在返回一個字段(要麼是vegetables要麼是fruits) - 爲什麼不是該字段標記爲@UiField(provided=true)?然後,無論您在分配這些字段時所做的任何佈線都可以在UiBinder中使用,而無需使用@UiConstructor方法。

@UiField(provided=true) 
SimpleComboBox<Fruit> fruits; 

//... 

public MyWidget() { 
    fruits = new SimpleComboBox<Fruit>(...); 

    binder.createAndBind(this); 
} 

...

<form:SimpleComboBox ui:field="fruits" /> 

如果這僅僅是一個過於簡單化了,你居然打算在這些方法中創建新的對象,然後再考慮傳遞一個論點,像String type,並根據該值返回不同的SimpleComboBox<?>。從你的UiBinder xml,你可以創建這樣的正確的東西:

<field:SimpleComboBox type="fruit" />