我想在同一窗口选项卡中显示不同的页面。我使用Empty和Empty1类。类Empty是主页,并且视图Empty1已加载到Empty。

该类称为Empty:

@Theme("valo")
@SpringUI(path = "empty")

public class Empty extends UI {

   @Autowired
   private SpringViewProvider viewProvider;

   @Override
   protected void init(VaadinRequest request) {
       System.out.println("init Empty");
       final VerticalLayout root = new VerticalLayout();
       root.setSizeFull();
       setContent(root);

       Navigator navigator = new Navigator(this, this);
       navigator.addProvider(viewProvider);
       navigator.navigateTo(Empty1.VIEW_NAME);
   }
}


和名为Empty1的类(视图):

@SpringView(name = Empty1.VIEW_NAME)
public class Empty1 extends VerticalLayout implements View {
   public static final String VIEW_NAME = "empty1";

   @PostConstruct
   void init() {
       addComponent(new Label("This is the default view"));
       System.out.println("init Empty1");
   }

   @Override
   public void enter(ViewChangeListener.ViewChangeEvent event) {
       // the view is constructed in the init() method()
   }
}


当我打开新窗口时,我看到句子“这是默认视图”,这没关系。但是,当我看着tracksace时,我发现句子“ init Empty1”显示了两次,为什么?

这意味着视图Empty1的内容已加载两次。我希望视图仅被加载一次。

最终的效果应该在“空”类中看起来像这样:

@Theme("valo")
@SpringUI(path = "empty")

public class Empty extends UI {

@Autowired
private SpringViewProvider viewProvider;

@Override
protected void init(VaadinRequest request) {
    System.out.println("init Empty");
    final VerticalLayout root = new VerticalLayout();
    root.setSizeFull();
    setContent(root);

    Navigator navigator = new Navigator(this, this);
    navigator.addProvider(viewProvider);

    int optionAuto = 2;

    switch (optionAuto) {
            case 1:
                getUI().getNavigator().navigateTo(Empty1.VIEW_NAME);
                break;
            case 2:
                getUI().getNavigator().navigateTo(Empty2.VIEW_NAME);
                break;
           }
    }
}


并且它起作用,但是视图“ Empty1”或“ Empty2”被调用了两次。我如何修改代码以使视图仅被调用一次?

最佳答案

发生这种情况的原因是因为您在Navigator.navigateTo()方法中调用了Empty.init()。每个导航操作都会创建一个新的View Bean实例(视图不是单例)。调用Navigator.navigateTo()之后,稍后将在UI.doInit()方法中再次调用它,这将导致第二个bean创建。

如果要将“ empty1”视图设为默认视图(如果未在url中指定其他视图,则显示默认视图),则应执行以下操作:

if ("".equals(navigator.getState())) {
    getPage().setUriFragment("!" + Empty1.VIEW_NAME, false);
}


当然,您也可以将视图命名为""以使其默认。

08-08 00:43