Ответ 1
Как сказал Кристиан, внутри файла UiBinder ui.xml
вам не нужно беспокоиться о вызове ensureInjected()
, следующие инструкции XML выполняют задание:
<ui:with field='myStyle' type='com...MyStyle'/>
<div class='{myStyle.redBorder}'/>
Конечно, предполагается, что существует определенный интерфейс MyStyle
:
public interface MyStyle {
public String redBorder();
}
Теперь я согласен с вами, что все становится раздражающим, когда вам нужно манипулировать расширением CssResource
за пределами шаблонов UiBinder. Именно потому, что вы должны позаботиться о вызове ensureInjected()
где-то перед использованием экземпляра MyStyle
с вашими виджетами.
Я лично использую GIN для ввода экземпляров расширений CssResource
всякий раз, когда мне это нужно. Таким образом вы можете реализовать пользовательский поставщик GIN, гарантирующий, что ensureInjected()
вызывается на CssResource
перед его вводом.
Там есть три шага:
-
Создайте интерфейс для
MyStyle
вместе с файлом CSS.
MyStyle.javapublic interface MyStyle { public String redBorder(); }
-
MyStyle.css
.redBorder { border: 1px solid red; }
-
Экспортируйте его через расширение
ClientBundle
.
Resources.javapublic interface Resources extends ClientBundle { @Source("MyStyle.css") public MyStyle style(); }
-
Настройте метод поставщика GIN для ввода ваших экземпляров
MyStyle
.
ClientModule.javapublic class ClientModule extends AbstractGinModule { @Override protected void configure() { //... } @Provides MyStyle createStyle(final Resources resources) { MyStyle style = resources.style(); style.ensureInjected(); return style; } }
Мы плавно вводим сюда экземпляр Resources
, что означает, что в любом месте не возникает проблем со статическим аксессуаром, вызывающим GWT.<Resources>create(Resources.class)
, все это происходит через инъекцию GIN.
Сделав это, вы можете ввести свои экземпляры MyStyle
, когда они вам понадобятся.
Например (в каком-то контексте MVP):
private Widget widget;
@Inject
public SomeView(final MyStyle style) {
//...
widget = uiBinder.createAndBindUi(this);
widget.addStyleName(style.redBorder());
}