首页 > 解决方案 > 如何在 Vaadin v8 中的视图之间导航?

问题描述

当我们尝试从登录导航到主页时,有人可以告诉我为什么我收到 NullPointerException。

登录页面有一个指向 HomePage 的 NavigaeTO 方法,如下所示

public class MyUI extends UI implements View {

    Navigator navigator;

    @Override
    protected void init(VaadinRequest vaadinRequest) {
        final VerticalLayout vlayout = new VerticalLayout();

        final TextField name1 = new TextField();
        name1.setCaption("Username");


        final TextField name2 = new TextField();
        name2.setCaption("Password");


        final HorizontalLayout hlaylout1 = new HorizontalLayout();
        Button button1 = new Button("Login",
        new Button.ClickListener() {

            @Override
            public void buttonClick(ClickEvent event) {

                System.out.print("Here is the View String "+NavigatorUI.HOMEVIEW);

             getNavigator().navigateTo(NavigatorUI.HOMEVIEW);
            }
        });
        Button button2 = new Button("Cancel");

        hlaylout1.addComponents(button1, button2);



        vlayout.addComponents(name1,name2, hlaylout1);

        setContent(vlayout);
    }

    @WebServlet(urlPatterns = "/*", name = "MyUIServlet", asyncSupported = true)
    @VaadinServletConfiguration(ui = MyUI.class, productionMode = false)
    public static class MyUIServlet extends VaadinServlet {
    }
}

单击登录按钮时应打开的主页是

public class HomeView extends UI implements View {

    Navigator navigator;

    @Override
    protected void init(VaadinRequest vaadinRequest) {
        final VerticalLayout vlayout = new VerticalLayout();

        final TextField name1 = new TextField();
        name1.setCaption("HomePage");           


        vlayout.addComponents(name1);

        setContent(vlayout);
    }

    @WebServlet(urlPatterns = "/*", name = "MyUIServlet", asyncSupported = true)
    @VaadinServletConfiguration(ui = MyUI.class, productionMode = false)
    public static class MyUIServlet extends VaadinServlet {
    }
}

Navigator 类是

public class NavigatorUI extends UI {

    Navigator navigator;
    public static final String HOMEVIEW = "HOMEVIEW";

    @Override
    protected void init(VaadinRequest request) {
        getPage().setTitle("Navigation Example");

        // Create a navigator to control the views  
        navigator = new Navigator(this, this);

        // Create and register the views
        navigator.addView(HOMEVIEW, new HomeView());
        navigator.addView("", new MyUI());
 //       navigator.addView(MAINVIEW, new MainView());

}

}

我收到 NavigateTo 方法的 NullPointerException。有人可以让我知道问题是什么吗?

标签: viewnavigationvaadinvaadin8

解决方案


您的代码中有几个问题:

  • 你定义多个servlet,一个就够了
  • 您所有的视图都扩展 UI,只有NavigatorUI应该扩展 UI,其他视图可以在构造函数中构建布局
  • 您的 servlet 配置为使用MyUI,但它应该NavigatorUI用于该 UI
  • 您应该覆盖getNavigator()inNavigatorUI以返回新创建的导航器,或调用setNavigator(navigator).
  • 您应该Navigator navigator从视图中删除该字段。

推荐阅读