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

时间:2019-07-01 10:03:17

标签: xamarin xamarin.forms xamarin.forms.shell

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

出了什么问题?:
启动应用程序(配对页面)并获取令牌并导航到第二页时-我们称其为“概述”-一切正常。概述中有一个按钮,该按钮调用一种方法来删除我的令牌并导航回到配对页面。那也很好。

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

我正在使用Xamarin的Shell导航并覆盖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:准入事件
args.Current.Location://Admission.Event.Pair

弹出概述页面,一切正常。也有一个有效的令牌。

单击“按钮”,该过程将删除令牌并导航到配对页面:
args.Target.Location:Admission.Event.Pair
args.Current.Location://Admission.Event.Pair/Admission.Event

令牌已正确删除(为空),并弹出配对页面。一切都很好。

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

有什么想法吗?
我首先想到的是目标位置可能有问题。

1 个答案:

答案 0 :(得分:0)

就像我在评论中说的那样:

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

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