何时使用GWT ensureInjected()?

use*_*313 17 css gwt

我在CSSResource中创建了一些样式,无论我使用它都能很好地工作

GWT.<MyResources>create(MyResources.class).myStyles().ensureInjected();
Run Code Online (Sandbox Code Playgroud)

或不.

任何人都可以了解这一点并解释何时使用ensureInjected?

谢谢!丹尼尔

mks*_*s-d 8

正如Christian所说, UiBinder ui.xml文件中你不必担心调用ensureInjected(),以下XML语句可以完成这项工作:

<ui:with field='myStyle' type='com...MyStyle'/>
Run Code Online (Sandbox Code Playgroud)
<div class='{myStyle.redBorder}'/>
Run Code Online (Sandbox Code Playgroud)

当然这是假设某个MyStyle界面定义了:

public interface MyStyle {
    public String redBorder();
}
Run Code Online (Sandbox Code Playgroud)

现在我同意你的看法,当你需要 UiBinder模板之外操作CssResource扩展时,事情会变得烦人.正是因为在使用小部件实例之前必须先处理某个地方的调用.ensureInjected()MyStyle

我个人使用GIN注入的扩展的情况下,CssResource每当我需要了进来,您就可以实现自定义GIN提供商确保ensureInjected()被称为在CssResource注射之前.这涉及三个步骤:

  • 创建一个MyStyle与CSS文件一起使用的界面.
    MyStyle.java

    public interface MyStyle {
        public String redBorder();
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • MyStyle.css

    .redBorder { border: 1px solid red; }
    
    Run Code Online (Sandbox Code Playgroud)
  • 通过ClientBundle扩展程序公开它.
    Resources.java

    public interface Resources extends ClientBundle {
        @Source("MyStyle.css")
        public MyStyle style();
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 配置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;
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

我们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());
}
Run Code Online (Sandbox Code Playgroud)


Igo*_*mer 6

好问题 - 我想到的一种情况是,当你想在UiBinder模板中使用来自某些全局样式表的样式时 - 那么你需要调用ensureInjected...确保在引用它们时确实注入了样式("本地" "在xml中定义的UiBinder样式是自动注入的.

您可以在Mail示例中看到这样使用:

public void onModuleLoad() {
    // Inject global styles.
    GWT.<GlobalResources>create(GlobalResources.class).css().ensureInjected();

    // Create the UI defined in Mail.ui.xml.
    DockLayoutPanel outer = binder.createAndBindUi(this);

    // ...rest of the code
}
Run Code Online (Sandbox Code Playgroud)

请注意ensureInjected在绑定UI之前如何调用.

这是我知道保证使用的唯一情况ensureInjected,但也许我错过了一些东西.


Tho*_*yer 6

规则很简单:你必须ensureInjected()明确调用,除非CssResource是从<ui:style>UiBinder模板中生成的(因为大部分时间你都没有生成的句柄CssResource.
具体来说,<ui:with>没有为CssResources 提供特殊处理.

此外,一些小部件采取特定ClientBundle的参数构造函数(如CellTable),便会调用ensureInjected()CssResource他们使用.