Как использовать UI.getCurrent (). Navigate ("route") внутри Mono.subscribe - PullRequest
0 голосов
/ 07 октября 2019
  public void onAlfrescoTicketReceived(Mono<Ticket> ticket) {
    ticket
        .log()
        .subscribe(
            consumer -> {
              this.sessionService.setTicket(consumer.getTicket());
              UI.getCurrent().navigate("route");
            });
  }

sessionService работает, но UI.getCurrent возвращает ноль. Есть ли способ навигации внутри подписки?

1 Ответ

3 голосов
/ 07 октября 2019

Возможно, выполняется в фоновом потоке. UI.getCurrent() работает только в потоке пользовательского интерфейса.

Вам необходимо сохранить ссылку на пользовательский интерфейс в точке, в которой вы все еще находитесь в потоке пользовательского интерфейса, или путем вызова getUI() для подключенного компонента. Если ваш метод выполняется в потоке пользовательского интерфейса, вы можете сохранить ссылку там. Затем вы вызываете UI#access для выполнения любых задач пользовательского интерфейса:

public void onAlfrescoTicketReceived(Mono<Ticket> ticket) {
    UI ui = UI.getCurrent();
    ticket
        .log()
        .subscribe(
            consumer -> {
              this.sessionService.setTicket(consumer.getTicket());
              ui.access(() -> ui.navigate("route"));
            });
}

Использование UI#access при вызове из фонового потока гарантирует, что сеанс заблокирован, чтобы не было никаких конфликтов в состоянии пользовательского интерфейса. ,Это также гарантирует, что UI.getCurrent() и VaadinSession.getCurrent() вернут правильные значения.

...