HTMLPanel 可以在 uiBinder 中使用,即使它没有无参数构造函数。怎么会?

HTMLPanel can be used in uiBinder even though it doesn't have a no-args constructor. How come?

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

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

they must be default instantiable; that is, they must provide a zero-argument constructor. However, there are a few ways to get around that. In addition to the @UiFactory and @UiField(provided = true) mechanisms described under Shared resource instances, you can mark your own widgets with the @UiConstructor annotation.

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

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

HTMLPanel 是一种特殊情况,它不能通过实施 HasHtmlHasWidgets 简单地存在,因为这些子窗口小部件需要附加到 [=26= 内的某个点] 结构体。因此,他们没有使用 public API(正如您在文档中发现的那样),而是……作弊了一点。

最终结果是您无法在自己的代码中复制的东西,除非实际派生 uibinder 并直接对其进行编辑。这已在其他项目中完成,但在以后对 UiBinder 进行更改时存在中断的高风险,因此通常应避免。

TL;DR:将 HTMLPanel 视为一种特殊情况,它可以稍微改变规则以更有用。在您自己的代码中,尝试坚持使用 UiFactory/UiConstructor/UiChild 注释、属性设置器,并为子内容实现支持的接口之一。