Как сказал Кристиан, внутри файла 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.java
public interface MyStyle {
public String redBorder();
}
MyStyle.css
.redBorder { border: 1px solid red; }
Экспонировать через расширение ClientBundle
.
Resources.java
public interface Resources extends ClientBundle {
@Source("MyStyle.css")
public MyStyle style();
}
Сконфигурируйте метод поставщика GIN для внедрения ваших экземпляров MyStyle
.
ClientModule.java
public 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());
}