http://www.gwtproject.org/doc/latest/DevGuideUiBinder.html

它指出要在uiBinder模板中使用小部件:


  它们必须是默认可实例化的;也就是说,它们必须提供零参数的构造函数。但是,有几种方法可以解决此问题。除了在共享资源实例下描述的@UiFactory@UiField(provided = true)机制之外,您还可以使用@UiConstructor批注标记自己的窗口小部件。


HTMLPanel不能满足这些要求,但是可以在UiBinder模板中使用。怎么来的?

最佳答案

GWT中的某些内置小部件在UiBinder中具有自定义支持,因此它们可以完成工作。对于这些情况,属性或元素经过特殊处理(请考虑<ui:with><ui:field>,当然还有<g:HTMLPanel>等),以便uibinder可以使用。

HTMLPanel是一种特殊情况,不能通过实现HasHtmlHasWidgets来简单存在,因为这些子窗口小部件需要在html结构内的某个位置附加。因此,他们没有使用公共API(如您在文档中所发现的),而是...有点作弊。

最终结果是,如果不实际分叉uibinder并直接对其进行编辑,就无法在自己的代码中进行复制。在其他项目中也可以做到这一点,但是在以后对UiBinder进行更改时,存在很高的中断风险,因此通常应避免使用。

TL; DR:将HTMLPanel视为特例,这可以稍微弯曲规则以使其更有用。在您自己的代码中,尝试使用UiFactory / UiConstructor / UiChild批注,属性的设置器,以及实现子内容的受支持接口之一。

10-07 13:16