我在CSSResource中创建了一些样式,无论是否使用

GWT.<MyResources>create(MyResources.class).myStyles().ensureInjected();

或不。

谁能阐明这一点,并解释何时使用ensureInjected?

谢谢!
丹尼尔

最佳答案

正如克里斯蒂安所说,在UiBinder ui.xml文件中,您不必担心调用ensureInjected(),以下XML语句可以完成此工作:

<ui:with field='myStyle' type='com...MyStyle'/>

<div class='{myStyle.redBorder}'/>

当然,这是假设在某个地方定义了MyStyle接口(interface):
public interface MyStyle {
    public String redBorder();
}

现在,我同意您的意见,当您需要在UiBinder模板之外操作CssResource扩展时,事情会变得很烦人。正是因为您必须在将ensureInjected()实例与窗口小部件一起使用之前,在某处调用MyStyle来处理。

我个人使用GIN在需要时注入(inject)CssResource扩展实例,这样您就可以实现一个自定义GIN提供程序,以确保在注入(inject)ensureInjected()之前调用CssResource
其中涉及三个步骤:
  • 与CSS文件一起为MyStyle创建一个接口(interface)。
    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提供程序方法以注入(inject)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;
        }
    }
    

  • 我们在上面顺利地注入(inject)了Resources实例,这意味着不再需要在任何地方调用GWT.<Resources>create(Resources.class)的静态访问器,而这一切都是通过GIN注入(inject)实现的。

    完成后,您可以在需要时注入(inject)MyStyle实例。
    例如(在某些MVP上下文中):
    private Widget widget;
    
    @Inject
    public SomeView(final MyStyle style) {
        //...
        widget = uiBinder.createAndBindUi(this);
        widget.addStyleName(style.redBorder());
    }
    

    10-06 15:16