您的要求非常简单,您的设计也应该如此。您只需要两个活动和两个视图:AccountView 和 ClaimsView。
您需要一个简单的小部件 - 一个带有两个标签样式为选项卡的 FlowPanel - 作为您的导航菜单。您将此小部件放在两个视图的顶部,并将 ClickHandler 附加到与另一个视图相对应的标签上 - 即在 AccountView 中将处理程序附加到 Claims 标签,这会触发 presenter.goTo(new ClaimsTab(""). Claims label应该在 ClaimsView 中设置为按下的选项卡,在 AccountView 中设置 Account 标签。这将负责导航:不需要特殊活动。
AccountView 很简单:顶部的导航小部件,下面的详细信息。对于 ClaimsView 使用分为三层的 LayoutPanel:顶层用于导航小部件,左侧层用于声明,右侧层用于详细信息。假设您将 Tree 用于索赔,并使用封装在 ScrollPanel 中的 FlowPanel(“claimDetailsPanel”)用于索赔详细信息。
您的 ClaimsView 应该有一个“已初始化”标志(带有 getter 和 setter)。当用户来到 ClaimsTab 位置时,您将启动 ClaimsActivity。此活动获取对 ClaimsView 的引用。它检查 ClaimsView 是否已初始化。如果没有,它会加载声明列表并填充声明树。构建树时,将每个声明设置为每个 TreeItem 的用户对象。然后将初始化标志设置为真。
您将选择处理程序附加到调用 presenter.goTo(new ClaimsTab(selectedClaim.getId().toString())); 的树上。
这会将用户发送回同一选项卡,但使用新的 URL 令牌 - 如果所选声明的 id=123,您将看到 #ClaimsTab:123 令牌。屏幕上不会有闪烁,因为 ClaimsView 已经构建并且仍然可见。
现在您将运行一个新的 ClaimsActivity。此活动注意到 (a) 有一个需要处理的令牌,以及 (b) 不需要加载声明并填充声明树,因为视图已初始化。您的活动应该解析令牌(将其转换为声明 ID),加载此声明的详细信息,并将此信息提供给 ClaimsView 以填充 claimDetailsPanel(您应该首先清除它,因为它可以包含先前声明的内容)。
一个小细节。用户可以为任何声明添加书签。因此,如果您的 ClaimsActivity 构建声明树,它应该检查令牌。带有书签的页面将有一个标记,因此活动应该告诉视图要选择哪个树项。
就是这样:两种观点,两种活动。没有嵌套。