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

问题描述

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

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

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 是很自然的,您可以在任何需要的地方注入。

另一种替代方法是将逻辑基于 #include<stdio.h> #include<math.h> float distance(float x1,float y1,float x2,float y2) { float dis; dis = sqrt((pow((x1-x2),2))+(pow((y1-y2),2))); return dis; } float area(float x1,float y2,float x3,float y3) { float aa; aa = ((x1*(y2-y3) + x2*(y3-y1) + x3*(y1-y2))/2); return aa; } int point(float a,float b,float x1,float y3,float A) { float area(float,float,float); float a1,a2,a3 ; a1=area(float a,float y3); a2=area(float x1,float a,float y3); a3=area(float x1,float b); if(a1 + a2 + a3 == A) return 1; else return 0; } int main() { float x1,y1,x2,y2,x3,y3,a,b,di,A; int p; printf("Enter the first coordinate: "); scanf("%f %f",&x1,&y1); printf("Enter the second coordinate: "); scanf("%f %f",&x2,&y2); di = distance(x1,y2); printf("The distance is: %f\n",di); printf("Enter the third coordinate: "); scanf("%f %f",&x3,&y3); A = area(x1,y3); printf("The area is: %f\n",A); printf("Enter the coordinate of point: "); scanf("%f %f",&a,&b); p = point(a,x1,A); printf("\n%d",p); return 0; }[Error that I am getting][1] 。 Flow 中的 UI.getCurrent() 方法具有 ComponentUtilsetData 方法,您可以使用它们将您自己的自定义实例附加到特定的组件实例。因此,您可以执行以下操作:

getData