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 是一种特殊情况,它不能通过实施 HasHtml
和 HasWidgets
简单地存在,因为这些子窗口小部件需要附加到 [=26= 内的某个点] 结构体。因此,他们没有使用 public API(正如您在文档中发现的那样),而是……作弊了一点。
最终结果是您无法在自己的代码中复制的东西,除非实际派生 uibinder 并直接对其进行编辑。这已在其他项目中完成,但在以后对 UiBinder 进行更改时存在中断的高风险,因此通常应避免。
TL;DR:将 HTMLPanel 视为一种特殊情况,它可以稍微改变规则以更有用。在您自己的代码中,尝试坚持使用 UiFactory
/UiConstructor
/UiChild
注释、属性设置器,并为子内容实现支持的接口之一。
在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 是一种特殊情况,它不能通过实施 HasHtml
和 HasWidgets
简单地存在,因为这些子窗口小部件需要附加到 [=26= 内的某个点] 结构体。因此,他们没有使用 public API(正如您在文档中发现的那样),而是……作弊了一点。
最终结果是您无法在自己的代码中复制的东西,除非实际派生 uibinder 并直接对其进行编辑。这已在其他项目中完成,但在以后对 UiBinder 进行更改时存在中断的高风险,因此通常应避免。
TL;DR:将 HTMLPanel 视为一种特殊情况,它可以稍微改变规则以更有用。在您自己的代码中,尝试坚持使用 UiFactory
/UiConstructor
/UiChild
注释、属性设置器,并为子内容实现支持的接口之一。