无法导航到之前调用过的页面

Posted

技术标签:

【中文标题】无法导航到之前调用过的页面【英文标题】:Cannot navigate to page which was called once before 【发布时间】:2019-07-01 10:03:17 【问题描述】:

对我的应用程序逻辑的简短介绍: 我的应用程序正在使用 REST-Api 并且需要一个用于所有请求的令牌,但一个特定的请求(我们称之为“配对页面”)。 在我导航到我的任何页面之前,我正在检查目标位置。如果我的目标是我请求令牌的页面,则不会检查现有令牌。 对于每个其他页面,都需要一个令牌。如果不存在令牌,则用户应导航回“配对页面”。 我的起始页是我的配对页。

有什么问题?: 当启动应用程序(配对页面)并获取令牌并导航到第二页时 - 我们称之为“概述” - 一切正常。概述有一个按钮,该按钮调用一个删除我的令牌并导航回配对页面的方法。这也行得通。

现在有趣的部分: 当我再次尝试配对并导航到概览时(第二次),没有完成导航。我的意思是我的概述没有弹出。

我正在使用 Xamarin 的 Shell Navigation 并覆盖 OnNavigating-Method。

代码:

protected override void OnNavigating(ShellNavigatingEventArgs args)

    // check if BearerToken exist. If so, navigate to Overview
    if (args.Target.Location.ToString() != "//Admission.Event.Pair"
        && args.Target.Location.ToString() != "Admission.Event.Pair")
    

        App app = App.Current as App;
        string bearerToken = RestServiceCalls.GetBearerToken(app._dependencyService);

        // if a the token is missing call the Pairing-Page
        if (string.IsNullOrEmpty(bearerToken) 
            || string.IsNullOrWhiteSpace(bearerToken))
        
            Device.BeginInvokeOnMainThread(async () =>  await NavigateToPageAsync("Admission.Event.Pair"); );
            return;
        
    

    base.OnNavigating(args);


async Task NavigateToPageAsync(object pageName, bool animate = true)

    await Xamarin.Forms.Shell.Current.GoToAsync($"pageName.ToString()", animate);
    Xamarin.Forms.Shell.Current.FlyoutIsPresented = false;

让我们看一下args:

应用启动,配对页面:args.Target.Location: //Admission.Event.Pair args.Current.Location:空 配对页面弹出,一切正常。

单击处理获取令牌的按钮,然后导航到概览:args.Target.Location: Admission.Event args.Current.Location: //Admission.Event.Pair 总览页面弹出,一切正常。也获得了一个有效的令牌。

单击处理删除令牌并导航到配对页面的按钮:args.Target.Location:Admission.Event.Pair args.Current.Location: //Admission.Event.Pair/Admission.Event 令牌被正确删除(为空)并弹出配对页面。一切正常。

现在问题出现了: 当我现在尝试获取令牌并再次导航到概览时,我的 args 具有此内容并且我的概览不会显示:args.Target.Location: Admission.Event args.Current.Location: //Admission.Event.Pair/Admission.Event/Admission.Event.Pair

你知道吗? 我的第一个想法是它可能是目标位置的问题。

【问题讨论】:

您是否使用调试器来验证在问题案例中实际上正在执行导航? 你的意思是如果OnNavigating被执行并调用base.OnNavigating(args)?如果是这样:是的,我有:/。 不,它真的到达NavigateToPageAsync("Admission.Event.Pair")了吗? 是的。一切正常。但!似乎外壳不支持导航堆栈中页面的多次调用。对我来说,我可以简单地使用 if (shell != null) INavigation navigation = shell.Navigation;导航.PopToRootAsync(); 编辑:我讨厌 Commets 中的格式 -_- 【参考方案1】:

就像我在评论中所说的:

对我来说,我可以简单地使用:

if(shell != null) 
  INavigation navigation = shell.Navigation; 
  navigation.PopToRootAsync(); 

【讨论】:

以上是关于无法导航到之前调用过的页面的主要内容,如果未能解决你的问题,请参考以下文章

微信h5页面调用第三方位置导航

使用window.open切换到之前打开过的新页面

Angular 应用如何回退到之前曾经浏览过的页面

React Router 根据组件的 API 调用有条件地导航到不同的页面

WPF的页面导航

WKWebView 底部视图显示不全