java - 在 Vaadin 框架中,如何获取客户端时区以用于渲染显示的第一个页面

标签 java vaadin vaadin-flow

从客户端获取时区的最新推荐方法是通过...

UI.getCurrent().getPage().retrieveExtendedClientDetails(extendedClientDetails -> {
        extendedClientDetails.getRawTimezoneOffset();
        extendedClientDetails.getTimezoneOffset();
});

但是,该方法在第一次调用时不是同步的。这意味着我们无法使用时区信息来渲染向用户显示的第一页。

是否有解决方法可以在渲染第一页之前(例如,在初始化 session 时)获取此信息?或者我可以以某种方式表明我希望 vaadin 在首次创建 session 时获取该信息吗?

最佳答案

没有办法做到这一点,因为 Vaadin 需要有机会在浏览器中运行 JavaScript 来查找该信息。作为解决方法,您可以实现任何依赖于该信息的 View ,以推迟呈现其实际内容,直到该信息可用为止。

因此,您的观点可能是这样的:

@Route
public class MyView extends VerticalLayout {
  public MyView() {
    UI.getCurrent().getPage().retrieveExtendedClientDetails(details -> {
      add(new Text("Your time zone offset: " + details.getTimezoneOffset()));
    });
  }
}

如果详细信息不可用,最初只会显示一个空壳。它通常应该只持续一会儿,直到获取扩展详细信息,这样用户甚至可能不会注意到延迟。如果你想让它更明确,那么你可以同时显示一些临时占位符内容,例如不确定的进度条。

UI.getCurrent().getPage().retrieveExtendedClientDetails(details -> {
  removeAll(); // Remove spinner if it happened to be there
  add(new Text("Your time zone offset: " + details.getTimezoneOffset()));
});
if (getComponentCount() == 0) {
  // We only get here if the Text component wasn't added immediately
  ProgressBar spinner = new ProgressBar();
  spinner.setIndeterminate(true);
  add(spinner);
}

关于java - 在 Vaadin 框架中,如何获取客户端时区以用于渲染显示的第一个页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67724284/

相关文章:

Java解析csv并创建对象

java - 从 RPG 调用 iSeries 上的远程 Java 程序

hover - 当用户将鼠标指针悬停在 Vaadin 7 中的网格或表格中的行上时,会发生 "mouse over"的事件吗?

css - Vaadin 14.6.1 - 错误 : Can't resolve 'lumo-css-framework/all-classes.css'

session - 获取 Vaadin Flow 中当前的 VaadinContext 和当前 VaadinSession(这两个位置都将状态存储为 "attribute"键值对)

java - 使用公共(public)接入点通过两个不同的网络传输文件

vaadin - 如何在 Vaadin Upload 中设置 vaadin-upload-file 组件的样式

vaadin - 使用@Push读取和写入cookie

css - 在 Vaadin Flow Web 应用程序中动态更改字体、字体大小、字体颜色等

java - 为什么条件运算符在 java switch case 中不起作用?