Java 在Vaadin框架中,如何获得客户端时区以用于呈现显示的第一个页面

Java 在Vaadin框架中,如何获得客户端时区以用于呈现显示的第一个页面,java,vaadin,vaadin-flow,Java,Vaadin,Vaadin Flow,从客户端获取时区的最新推荐方法是通过 UI.getCurrent().getPage().retrieveExtendedClientDetails(extendedClientDetails -> { extendedClientDetails.getRawTimezoneOffset(); extendedClientDetails.getTimezoneOffset(); }); 但是,此方法在第一次调用时并不同步。这意味着我们不能使用时区信息来呈现

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

UI.getCurrent().getPage().retrieveExtendedClientDetails(extendedClientDetails -> {
        extendedClientDetails.getRawTimezoneOffset();
        extendedClientDetails.getTimezoneOffset();
});
但是,此方法在第一次调用时并不同步。这意味着我们不能使用时区信息来呈现显示给用户的第一页


在呈现第一页之前(例如,会话初始化时),是否有办法获取此信息?或者,我是否可以指出,我希望vaadin在首次创建会话时获取该信息?

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

因为Vaadin需要在浏览器中运行JavaScript来查找该信息,所以无法执行JS。作为一种变通方法,您可以实现依赖于信息的任何视图,以推迟呈现其实际内容,直到信息可用为止

因此,你的观点可以是这样的:

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

这就是我目前正在做的,但我希望有一种方法可以告诉Vaadin将它们作为初始框架引导的一部分进行检索。在创建视图实例时,初始引导甚至不一定发生。