У нас есть класс RouterLayout в качестве фрейма для остальной части нашего приложения, который включает в себя различные неизменяемые компоненты, включая элемент уведомления, который должен оставаться видимым во время навигации.
@CssImport("./styles/shared-styles.css")
public class MainFrame extends Composite<VerticalLayout> implements RouterLayout, PageConfigurator, AfterNavigationObserver {
// central Notification that persists throughout navigation
private Notification notification;
// other stuff....
}
Теперь мы пытаемся показать это уведомление из любого места в нашем коде, чтобы все представления, компоненты и подкомпоненты могли отображать простое уведомление.
К сожалению, я не знаю простого способа получить доступ к уведомлению, которое существует внутри RouterLayout, потому что мы не можем получить доступ к уровню макета текущего пользовательского интерфейса. Помещение уведомления в представление (содержимое маршрутизатора) не работает, потому что оно уничтожается при навигации. Попытка использовать шину событий не работает, потому что прослушиватели событий внутри routerlayout не будут вызываться при запуске из содержимого маршрутизатора (насколько я тестировал).
Мы надеемся достичь простого статического класса доступа, который может получить доступ к компоненту уведомления установленного в данный момент маршрутизатора.
public static void showNotification(String text) {
// something like this
MainFrame frame = ((MainFrame)UI.getCurrent().getRouterLayout()).showNotification(text);
}
В основном мы не знаем о простом способе взаимодействия с текущим установленным макетом текущего пользовательского интерфейса из любого места внутри нашего приложения, аналогично UI.getCurrent()
. Есть ли способ добиться чего-то подобного?