我有以下情况。我的UI表单上有两个组合,一个显示蔬菜列表,另一个显示水果列表。
在我的支持视图课程中,我想声明这样的方法:
@UiFactory
SimpleComboBox<Vegetable> createVegetablesCombo() {
return vegetables;
}
@UiFactory
SimpleComboBox<Fruit> createFruitsCombo() {
return fruits;
}
但似乎GWT无法识别参数化的返回类型......每次出现错误时:
ERROR: Duplicate factory in class VegetablesAndFruitsView for type SimpleComboBox.
有可能处理这种情况吗?在一个UI表单上有多个组合框的好例子吗?
答案 0 :(得分: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<?>
不同的<field:SimpleComboBox type="fruit" />
价值。从你的UiBinder xml,你可以创建这样的正确的东西:
{{1}}