Como dijo Christian, dentro del archivo UiBinder ui.xml
usted no tiene que preocuparse acerca de cómo invocar ensureInjected()
, las siguientes sentencias XML hacen el trabajo:
<ui:with field='myStyle' type='com...MyStyle'/>
<div class='{myStyle.redBorder}'/>
Por supuesto, esto es suponiendo que hay alguna parte de una interfaz definida MyStyle
:
public interface MyStyle {
public String redBorder();
}
Ahora estoy de acuerdo w Creo que las cosas se vuelven molestas cuando necesita manipular la extensión CssResource
fuera de de plantillas de UiBinder. Precisamente porque tienes que encargarte de invocar ensureInjected()
en alguna parte antes de utilizar la instancia MyStyle
con tus widgets.
Yo personalmente uso GIN para inyectar los casos de ampliaciones de CssResource
cada vez que necesito them.That manera se puede implementar un proveedor de GIN a medida asegurando que ensureInjected()
se llama en la CssResource
antes de inyectarlo. Hay tres pasos que hay:
crear una interfaz para MyStyle
junto con un archivo CSS.
MyStyle.java
public interface MyStyle {
public String redBorder();
}
MyStyle.css
.redBorder { border: 1px solid red; }
exponerlo a través de una extensión ClientBundle
.
Resources.java
public interface Resources extends ClientBundle {
@Source("MyStyle.css")
public MyStyle style();
}
configurar un método de proveedor de GIN para inyectar las instancias de 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;
}
}
Nos inyectar suavemente la instancia Resources
aquí arriba, lo que significa no más problemas de un descriptor de acceso estática llamando GWT.<Resources>create(Resources.class)
en cualquier lugar, simplemente todo sucede a través de la inyección de GIN.
Una vez hecho esto, puede inyectar sus instancias de MyStyle
cuando las necesite.
Por ejemplo (en algún contexto MVP):
private Widget widget;
@Inject
public SomeView(final MyStyle style) {
//...
widget = uiBinder.createAndBindUi(this);
widget.addStyleName(style.redBorder());
}
Sí, también lo entendí pero: estoy usando un archivo css global y funciona bien si utilizo EnsureInjected o no. Este es el misterio que trato de resolver. – user198313