使用UiField和UiFactory在UIBinder小部件中创建顺序

时间:2013-03-14 13:09:24

标签: gwt uibinder

在我的场景中(欢迎修改)我有一个带有导航和内容面板的主页面:

main
 |
 +--- Navigation (sets contents in ContentPage)
 |
 \--- ContentPage 

现在,Navigation需要对ContentPage的引用,因此它实际上可以更改内容。这意味着在构建main时,需要将ContentPage传递给Navigation。这是我目前正在使用的代码:

public class Main extends Composite {

    @UiField
    Panel contentPanel;

    @UiFactory
    Navigation makeNavigation() {
        return new Navigation(contentPanel);
    }

    interface MyUiBinder extends UiBinder<Widget, Middle> {
    }

    private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);

    public Main() {
        initWidget(uiBinder.createAndBindUi(this));
    }
}

问题在于,在调用makeNavigation时,UiField contentPanel尚未设置(它为空)。我想这是合理的,因为我没有保证initWidget被调用。

所以,我接近这个错误吗?有没有办法选择创建订单?

2 个答案:

答案 0 :(得分:1)

显然,窗口小部件实例化顺序是ui.xml文件中的显示顺序,因此如果您希望在导航之前对contentPanel进行实例化,则必须将其放在xml之前。

我同意,这不是解决方案......

答案 1 :(得分:0)

到目前为止,我已经使用以下方法开展工作:

public class Middle extends Composite {

    @UiField
    Panel contentPanel;

    @UiField
    Navigation navigation;

    interface MyUiBinder extends UiBinder<Widget, Middle> {
    }

    private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);

    public Middle() {
        initWidget(uiBinder.createAndBindUi(this));
        navigation.setContentPanel(contentPanel);
    }
}

这可以保证contentPanel存在,但有点将Navitagion页面的构建阶段分为两步。这是“社区认可的”方法吗?