1

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

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

现在,Navigation需要一个引用,ContentPage以便它可以实际更改内容。这意味着何时main构建,它需要传递ContentPageNavigation. 这是我目前正在使用的代码:

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已被调用。

那么,我接近这个错误吗?有没有办法选择创建顺序?

4

2 回答 2

1

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

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

于 2013-05-02T09:01:52.567 回答
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分为两个步骤。这是“社区认可”的方法吗?

于 2013-03-14T13:28:51.243 回答