私が採用したアプローチは、履歴トークンをコードに保存することでした(提案されているように)。PlaceControllerを拡張し、それを使用してEventBusでのPlaceの変更を追跡しました。これで、PlaceControllerを使用していたすべての場所で、代わりにPlaceControllerExtを使用します。これには、元の場所に戻るための優れたprevious()メソッドがありますが、前方に移動してアプリケーションを離れることはありません。
public class PlaceControllerExt extends PlaceController {
private final Place defaultPlace;
private Place previousPlace;
private Place currentPlace;
public PlaceControllerExt(EventBus eventBus, Place defaultPlace) {
super(eventBus);
this.defaultPlace = defaultPlace;
eventBus.addHandler(PlaceChangeEvent.TYPE, new PlaceChangeEvent.Handler() {
public void onPlaceChange(PlaceChangeEvent event) {
previousPlace = currentPlace;
currentPlace = event.getNewPlace();
}
});
}
/**
* Navigate back to the previous Place. If there is no previous place then
* goto to default place. If there isn't one of these then it'll go back to
* the default place as configured when the PlaceHistoryHandler was
* registered. This is better than using History#back() as that can have the
* undesired effect of leaving the web app.
*/
public void previous() {
if (previousPlace != null) {
goTo(previousPlace);
} else {
goTo(defaultPlace);
}
}
}