无法在春季获得UI



在我的程序的第一个版本中,我以这种方式加载主屏幕没有问题:

public class MyUI extends UI {
    public void showMainView() {
        addStyleName(ValoTheme.UI_WITH_MENU);
        setContent(new MainScreen(MyUI.this));
        mainScreen.setUI(MyUI.this);  
    }
    public static MyUI get() {
        return (MyUI) UI.getCurrent();
    }
}

但是现在,我已将其更改为:

@SpringUI
@Viewport("user-scalable=no,initial-scale=1.0")
@Theme("mytheme")
public class MyUI extends UI {
    @Autowired
    MainScreen mainScreen;
    public void showMainView() {
        addStyleName(ValoTheme.UI_WITH_MENU);
        setContent(mainScreen);
        getNavigator().navigateTo(getNavigator().getState());  
    }
    public static MyUI get() {
        return (MyUI) UI.getCurrent();
    }
}

要通过@Autowired获取MainScreen,我必须清除MainScreen的构造函数,但我不知道现在如何获得导航器所需的UI

我只是在两种方式上都为

@Component
@UIScope
public class MainScreen extends HorizontalLayout {
    public MainScreen() {
        UI ui = UI.getCurrent();     // is null
        MyUI ui2 = MyUI.get();       // is null
        CssLayout viewContainer = new CssLayout();
        viewContainer.addStyleName("valo-content");
        viewContainer.setSizeFull();
        final Navigator navigator = new Navigator(ui, viewContainer);
        // ... 
}

我不熟悉你标记的所有框架。我将解决我认为是逻辑错误或可能不正确的设计的问题。

如果你把MainScreen @AutowireUI里,你就让春天保证了那里的一切。如果使用首选的构造函数注入来查看它,则可能会更明显。

public class MyUI extends UI {
    private MainScreen mainScreen;
    @Autowired
    public MyUI (MainScreen mainScreen) {
        this.mainScreen = mainScreen;
    }
}

MainScreen此时已经实例化,并且很可能已经在代码的其他部分中,因此mainScreen构造函数不应依赖于MyUI

你如何处理它取决于期望的行为和关系是什么。如果你需要mainScreen中的UI类,但不能依赖于它的可用性,那么你必须从UI类本身(mainScreen.foo(this);(传入它。

相关内容

  • 没有找到相关文章

最新更新