如何在 Mono.subscribe 中使用 UI.getCurrent().navigate("route")
How to use UI.getCurrent().navigate("route") inside Mono.subscribe
public void onAlfrescoTicketReceived(Mono<Ticket> ticket) {
ticket
.log()
.subscribe(
consumer -> {
this.sessionService.setTicket(consumer.getTicket());
UI.getCurrent().navigate("route");
});
}
sessionService 有效,但 UI.getCurrent returns 无效。有没有办法在订阅内导航?
它可能是在后台线程中执行的。 UI.getCurrent()
仅在 UI 线程中有效。
您需要在您仍在 UI 线程中的某个位置存储对 UI 的引用,或者通过在附加组件上调用 getUI()
。如果您的方法在 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()
returns 正确的值。
public void onAlfrescoTicketReceived(Mono<Ticket> ticket) {
ticket
.log()
.subscribe(
consumer -> {
this.sessionService.setTicket(consumer.getTicket());
UI.getCurrent().navigate("route");
});
}
sessionService 有效,但 UI.getCurrent returns 无效。有没有办法在订阅内导航?
它可能是在后台线程中执行的。 UI.getCurrent()
仅在 UI 线程中有效。
您需要在您仍在 UI 线程中的某个位置存储对 UI 的引用,或者通过在附加组件上调用 getUI()
。如果您的方法在 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()
returns 正确的值。