Показывать уведомление Vaadin после перезагрузки страницы

В Vaadin я хочу показывать уведомление после перезагрузки страницы:

UI.getCurrent().getPage().reload();
new Notification("Success", 5000).open();

Но при этой попытке уведомление не отображается. В чем здесь проблема и как ее исправить?

Делает что-л. типа UI.getCurrent().getPage().executeJs("window.location.reload(‌​);").then(val -> {new Notification("Success", 5000).open();}); работа?

Andrey B. Panfilov 19.05.2024 11:34
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
1
78
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Хотя кажется, что показывать уведомление очень важно, это все равно является частью состояния пользовательского интерфейса; поэтому, когда вы перезагружаете, вы по сути (пере) создаете новый государство, частью которого уведомление не является.

Вы должны подать сигнал «новому» пользовательскому интерфейсу, что вы хотите, чтобы что-то было сделано.

Один из способов сделать это — сохранить маркер внутри сеанса (где все пользовательские интерфейсы часть). Затем используйте наблюдателя для компонента (или слушателя для всего вашего компонента). приложение), чтобы после завершения навигации разрешить уведомление.

Например.

@Route(value = "", layout = MainLayout)
@SuppressWarnings('unused')
class MainView extends Composite<Div> implements AfterNavigationObserver {

    public static final String RELOADED_KEY = 'reloaded'

    MainView() {
        content.add(
                new Button("Reload and notify", {
                    getUI().get().tap {
                        getSession().setAttribute(RELOADED_KEY, true)
                        getPage().reload()
                    }
                })
        )
    }

    @Override
    void afterNavigation(AfterNavigationEvent afterNavigationEvent) {
        def session = getUI().get().getSession()
        if (session.getAttribute(RELOADED_KEY)) {
            session.setAttribute(RELOADED_KEY, false)
            Notification.show('Reloaded...')
        }
    }
}

Если вы хотите наблюдать за событием реферирования и предпринимать какие-либо действия, когда это происходит, вам необходимо сохранить пользовательский интерфейс при обновлении. В противном случае пользовательский интерфейс создается заново, как описано в ответе @cfrick выше.

Способ сделать это — аннотировать представление с помощью @PreserveOnRefresh. Затем реализуйте интерфейс BeforeEnterObserver.

Это дает вам метод beforeEnter, который вы можете переопределить, чтобы показывать уведомление при обновлении.

@Override
public void beforeEnter(BeforeEnterEvent event) {
    if (event.isRefreshEvent()) {
        Notification.show("Hello there");
    }
}

Другие вопросы по теме