Vaadin Flow 访问当前 RouterLayout(从任何地方)

Vaadin Flow Access Current RouterLayout (from anywhere)

我们有一个 RouterLayout class 作为我们应用程序其余部分的框架,其中包括不同的不变组件,包括一个通知元素,需要在整个导航过程中保持可见。

@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 中的通知,因为我们无法访问当前 UI 的布局级别。将通知放在视图(路由器内容)中是行不通的,因为它在导航时被破坏了。尝试使用事件总线不起作用,因为从路由器内容内部触发时不会调用路由器布局内部的事件侦听器(据我测试)。

我们希望实现的是有一个静态方式的简单访问class,能够访问当前设置的路由器的通知组件。

public static void showNotification(String text) {
    // something like this
    MainFrame frame = ((MainFrame)UI.getCurrent().getRouterLayout()).showNotification(text);
}

基本上我们不知道有一种简单的方法可以从我们应用程序内部的任何地方与当前 UI 的当前设置布局进行通信,类似于 UI.getCurrent()。有没有办法实现这样的目标?

我不会直接将其与导航和路由器布局的概念联系起来。您所拥有的是 UI 实例范围内的“单例”功能。

如果使用 Spring 或 CDI,那么这很自然地定义为 UI 范围内的托管 bean,您可以在任何需要的地方注入。

另一种选择是将逻辑基于UI.getCurrent()。 Flow 中的 ComponentUtil 方法有 setDatagetData 方法,您可以使用它们将自己的自定义实例附加到特定组件实例。因此,您可以这样做:

ComponentUtil.getData(UI.getCurrent(), MainFrame.class).showNotification("Hello");