GWT - 如何处理同一事件的多个处理程序

GWT - How to handle multiple handlers for the same event

我目前正在处理一个 GWT 项目。我有一个在多个页面之间共享的公共块。我在那个公共块上有一些操作按钮,页面有一个处理程序,用于处理单击这些操作按钮时启动的事件。

我面临的问题是,当我单击页面 A 上的其中一个操作按钮时,也会调用页面 B 中预先注册的处理程序。

所以我想到的解决方案是在我们离开页面时从页面中删除处理程序,这样一次就只有一个页面具有针对相同操作按钮事件的已注册处理程序。

首先,我注册到操作按钮单击事件并保存从 addHandler 方法返回的 HandlerRegistration 对象:

HandlerRegistration actionButtonClickEventHandlerRegistration=eventBus.addHandler(CommonBlockActionButtonClickedEvent.TYPE, someHandler);

然后,在页面更改事件中,我从之前保存的 HandlerRegistration 对象调用 removeHandler

eventBus.addHandler(PageChangeEvent.TYPE, new PageChangeEventHandler() {
    @Override
    public void onMainPageChange(PageChangeEvent event) {
        actionButtonClickEventHandlerRegistration.removeHandler();
    }
});

所以我在每个页面上都这样做,除了当我启动我的应用程序并转到其中两个页面时,我收到此错误:

Caused by: java.lang.AssertionError: redundant remove call

你们知道为什么我会收到此错误或有其他方法可以解决我的问题吗?

非常感谢!

我会在删除处理程序后将其设置为 null,并在删除它之前检查它是否真的为 null。 像这样:

eventBus.addHandler(PageChangeEvent.TYPE, new PageChangeEventHandler() {
    @Override
    public void onMainPageChange(PageChangeEvent event) {
        if(actionButtonClickEventHandlerRegistration != null ) {
            actionButtonClickEventHandlerRegistration.removeHandler();
            actionButtonClickEventHandlerRegistration = null;
        }
    }
});

尽管如此,您似乎至少删除了处理程序两次,应该为此检查您的程序逻辑。

一个好的方法是在(浏览器的)调试器中的删除处理程序的行上设置一个断点。如果您查看每次调用的调用堆栈,您应该能够发现重复调用并修复它。