包装 PrismForms NavigationService 的问题

Issues with wrapping PrismForms NavigationService

在 PrismForms 中,我们遇到了问题,导航到新页面后 NavigationStack 为空。这意味着在 SecondPage 上使用硬件 back-button 后,应用程序将关闭。尽管 Android 上的 header 中的 back-arrow 未显示。如果仔细观察,您可以在页面切换后的一小段时间看到 back-arrow。我想那是在清除 NavigationStack 之前。

我们在 App.xaml.cs 派生自 PrismApplication 的 OnInitialized() 中使用以下命令导航到第一页。

    NavigationService.NavigateAsync("NavigationPage/StartPage");

(如果这里只导航到“StartPage”,堆栈不会被清除。)

这与 PageNavigationService.ProcessNavigationForNavigationPage(...) 调用有关 bool clearNavStack = GetClearNavigationPageNavigationStack(currentPage); PageNavigationService.ProcessNavigationForContentPage(...) 不是。

从 StartPage 到下一个我们使用 NavigateAsync("SecondPage") 导航”。这里出现了所描述的行为。

对于导航,我们使用包装 Prism NavigationService 的 class。我们将他保存为 属性 并在我们的构造函数中通过 Unity 获取他:

    this.PrismNavigation = prismNavigation ?? throw new ArgumentNullException(nameof(prismNavigation));

方法“NavigateAsync”和“GoBackAsync”等我们只是通过。

通过这种方式,我们希望将 ViewModel-Project 与对 XamarinForms 的引用分开,以便以后能够使用相同的 ViewModel,例如 WPF-GUI.

为什么我们自己的NavigationService会清空栈?如果我们改为在 App.xaml.cs 中注册原始的 Prism NavigationService,则导航返回会再次按预期工作。我们在框架中找到了要点,可以通过 drity hack 避免清除,但这与 PrismForms 中实现的 navigation-logic 相悖,但我们不明白如何以正确的方式进行。

感谢您的帮助!

在找到 Brian Lagunas 在 forlast-post 中提供的一些有趣信息后,我们编辑了一些内容以使其正常工作:

https://github.com/PrismLibrary/Prism/issues/591

尽管该主题是关于其他内容的,但它导致了对覆盖导航服务的改进。

请记住,在您的视图模型中,导航服务必须按照惯例命名为 "navigationService"。此外,我们从仅将 Prism 导航服务作为参数保存为按照上面 link 中的建议从中派生。

    public class MyNavigationService : UnityPageNavigationService