2016-05-19 2 views
1

В http://www.gwtproject.org/doc/latest/DevGuideUiBinder.htmlHTMLPanel можно использовать в uiBinder, даже если он не имеет конструктора no-args. Как так?

говорится, что использовать виджет в uiBinder шаблона:

они должны быть по умолчанию инстанциируемый; то есть они должны предоставить конструктор с нулевым аргументом. Однако есть несколько способов обойти это. В дополнение к механизмам @UiFactory и @UiField(provided = true), описанным в экземплярах общих ресурсов, вы можете пометить свои собственные виджеты аннотацией @UiConstructor.

HTMLPanel не заполнит ни одно из этих требований, и все же он может быть использован в UiBinder шаблоне. Как так?

ответ

1

Некоторые встроенные виджеты в GWT имеют пользовательскую поддержку в UiBinder, чтобы они могли выполнять свою работу. Для этих случаев атрибуты или элементы специально обрабатываются (подумайте о <ui:with>, <ui:field> и, конечно, <g:HTMLPanel> и т. Д.), Чтобы использовать uibinder.

HTMLPanel - это особый случай, когда он не может просто существовать, реализуя HasHtml и HasWidgets, так как эти дочерние виджеты должны быть добавлены в определенный момент внутри структуры html. Таким образом, вместо того, чтобы работать с общедоступным API (как вы нашли в документах), они ... немного обманули.

Конечный результат - это то, что вы не можете реплицировать в своем собственном коде без фактического поиска uibinder и редактирования его непосредственно. Это было сделано в других проектах, но имеет высокий риск взлома, когда происходят более поздние изменения в UiBinder, поэтому обычно следует избегать.

TL; DR: Обработать HTMLPanel как частный случай, который может немного сгладить правила, чтобы быть более полезным. В своем собственном коде попытайтесь придерживаться аннотаций UiFactory/UiConstructor/, настраивающих атрибуты и реализации одного из поддерживаемых интерфейсов для дочернего контента.