在 Vaadin 框架中,如何让客户端时区用于呈现显示的第一页

In Vaadin framework, how can I get the client time zone to use in rendering the very first page displayed

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

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

但是这个方法在第一次调用时不是同步的。这意味着我们不能使用时区信息来呈现显示给用户的第一页。

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

我相信答案是否定的。浏览器不会在初始请求中提供该信息;只有第一个响应返回到浏览器后才能执行 JS。

无法做到这一点,因为 Vaadin 需要在浏览器中 运行 JavaScript 才能找到该信息。作为一种解决方法,您可以实现任何依赖于信息的视图,以推迟呈现其实际内容,直到信息可用。

您的观点可能是这样的:

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

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

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);
}