【问题标题】:Why does absolute navigation URL not clear navigation stack?为什么绝对导航 URL 不清除导航堆栈?
【发布时间】:2019-11-25 17:09:48
【问题描述】:

当我调查一个问题时,即使在导航到另一个页面后,我的应用仍停留在初始屏幕上,我发现了一些对我来说似乎很奇怪的事情。

我设法在一个小而简单的项目中重现了这个问题。 基本上我的 Prism 项目中有 3 个页面和 ViewModel:SplashPage (ContentPage)、MainPage (ContentPage)、RootPage (MasterDetailPage)。

它们都注册了导航,以及 NavigationPage。

这是我的 App.xaml.cs 中的内容:

protected override async void OnInitialized()
{
     InitializeComponent();
     await NavigationService.NavigateAsync("/SplashPage");
}

并在 SplashPageViewModel 的 OnNavigatedTo 覆盖:

public override async void OnNavigatedTo(INavigationParameters parameters)
{
    Debug.WriteLine($"URI: {NavigationService.GetNavigationUriPath()}");
    await NavigationService.NavigateAsync("/RootPage/NavigationPage/MainPage");
    Debug.WriteLine($"URI: {NavigationService.GetNavigationUriPath()}");     
}

这是输出:

[0:] URI: /SplashPage
[0:] URI: /RootPage/NavigationPage/MainPage/SplashPage?useModalNavigation=true

我感到很困惑,因为我认为任何以“/”开头的导航请求都应该清除导航堆栈。那么为什么 SplashPage 仍然存在?

【问题讨论】:

  • 试试这个:await NavigationService.NavigateAsync("app:///RootPage/NavigationPage/MainPage");
  • 谢谢,但结果相同

标签: xamarin.forms prism


【解决方案1】:

你遇到了一个有趣的问题!!。我从未尝试在OnNavigatedTo中导航

您可能想与 Brian Lagunas 谈谈 OnNavigatedTo 的内部运作,或者看看 repo

阅读您的问题后,我能够重现相同的行为。更进一步,我在调用MainPage 时添加了一些延迟,它工作得很好。

public override async void OnNavigatedTo(INavigationParameters parameters)
{
    Debug.WriteLine($"URI: {NavigationService.GetNavigationUriPath()}");
    Task.Run(async() => {
    await Task.Delay(2000);
    Device.BeginInvokeOnMainThread(async () => {
        await NavigationService.NavigateAsync("/RootPage/NavigationPage/MainPage");
    }});
    Debug.WriteLine($"URI: {NavigationService.GetNavigationUriPath()}");     
}

控制台中的输出仍然相同,但是当我在MainPage OnNavigatedTo 中打印导航页面时,它显示正确!并且 UI/导航堆栈没有 SplashPage

当心:这是一种黑客行为,我强烈建议不要不必要地拨打Task.Run

【讨论】:

  • 是的,我希望布赖恩能读到这篇文章。我没有检查导航堆栈本身,因为我假设从 GetNavigationUriPath 返回的内容准确地反映了我们在堆栈中可以找到的内容。但这似乎不是真的。
  • 是的,我猜它会在推送页面后在后台清理...所以如果您导航“足够快”,您可能会遇到问题
  • 抱歉,但是当您说“我能够重现相同的行为”时,您是说启动页面停留在主页上方吗?因为即使在我的真实应用程序中我确实遇到了这个问题,我也无法在发布之前构建的示例应用程序中重现它:显示了 MainPage。但是导航 Uri 似乎是错误的。
  • Naah 只是 NavigationUri...堆栈很好
  • “当心:它是一种黑客行为,我强烈建议不要不必要地调用 Task.Run” ...您为什么建议不要不必要地调用 Task.Run?
【解决方案2】:

用于清除导航堆栈

使用下面的 Abosulute Uri 清除所有导航堆栈

await NavigationService.NavigateAsync(new Uri("app:///RootPage/NavigationPage/MainPage", UriKind.Absolute));

在您的情况下,您似乎只想从堆栈中删除启动画面页面,然后您可以像下面这样简单地更改。

await NavigationService.NavigateAsync("../RootPage/NavigationPage/MainPage");

注意:- 上述语法将从 NavigationStack 中清除 SplashScreen(此外,如果您使用 prism.forms 7+ 版本,这将起作用)

【讨论】:

  • 第一个解决方案有效,谢谢。第二个不起作用,因为相对导航只允许在 NavigationPage 内。但这并不能说明为什么我的第一个示例中的语法不起作用。
猜你喜欢
  • 1970-01-01
  • 2015-04-13
  • 1970-01-01
  • 2015-10-31
  • 1970-01-01
  • 2018-08-21
  • 2020-04-26
  • 1970-01-01
  • 2015-06-26
相关资源
最近更新 更多