public void onAlfrescoTicketReceived(Mono<Ticket> ticket) {
ticket
.log()
.subscribe(
consumer -> {
this.sessionService.setTicket(consumer.getTicket());
UI.getCurrent().navigate("route");
});
}
sessionService有效,但是UI.getCurrent返回null。有没有办法在订阅中导航?
答案 0 :(得分:3)
它可能在后台线程中执行。 UI.getCurrent()
仅在UI线程中起作用。
您需要在仍然位于UI线程中的位置,或通过在连接的组件上调用getUI()
来存储对UI的引用。如果您的方法是在UI线程中执行的,则可以在其中存储引用。然后,您调用UI#access
来执行所有UI任务:
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状态不会发生任何冲突。它还可以确保UI.getCurrent()
和VaadinSession.getCurrent()
返回正确的值。