在我的程序的第一个版本中,我以这种方式加载主屏幕没有问题:
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
@Autowire
到UI
里,你就让春天保证了那里的一切。如果使用首选的构造函数注入来查看它,则可能会更明显。
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);
(传入它。