Невозможно перейти на страницу, которая была вызвана ранее - PullRequest
0 голосов
/ 01 июля 2019

Краткое введение в логику моего приложения: мое приложение использует REST-Api и ему нужен токен для всех запросов, кроме определенного (давайте назовем его «страницей сопряжения»).Прежде чем перейти к любой из моих страниц, я проверяю местоположение цели.Если моей целью является страница, на которой я запрашиваю токен, то проверка существующего токена не производится.Для каждой другой страницы нужен токен.Если токена не существует, пользователь должен вернуться на «страницу сопряжения».Моя стартовая страница - это моя страница регистрации.

В чем проблема?:
При запуске приложения (странице сопряжения) и получении токена и переходе на 2-ю страницу - назовем это «обзор»- все отлично.В обзоре есть кнопка, которая вызывает метод, который удаляет мой токен и возвращается на страницу сопряжения.Это также работает.

Теперь интересная часть: когда я пытаюсь выполнить сопряжение и снова перейти к обзору (второй раз), навигация не выполняется.Под этим я подразумеваю, что мой обзор не появляется.

Я использую навигацию оболочки Xamarin и переопределяю метод OnNavigating.

Код:

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.Target.Location: //Admission.Event.Pair
args.Current.Location: null

Появляется страница сопряжения, все в порядке.

Нажмите на кнопку, которая обрабатывает получение токена, и после этого перейдите к обзору:
args.Target.Location: Admission.Event
args.Current.Location: // Прием.Event.Pair

Появляется страница обзора, все в порядке.Также есть действительный токен.

Нажмите кнопку, которая обрабатывает удаление токена и переход на страницу сопряжения:
args.Target.Location: Admission.Event.Pair
args.Current.Location: //Admission.Event.Pair/Admission.Event

Токен удален правильно (является нулевым), и страница сопряжения открывается.Все в порядке.

Теперь возникает проблема:
Когда я сейчас пытаюсь получить токен и снова перейти к обзору, мои аргументы содержат это содержание, и мой обзор не будет отображаться:
args.Target.Location: Admission.Event
args.Current.Location: //Admission.Event.Pair/Admission.Event/Admission.Event.Pair

Есть идеи по этому поводу?
Сначала я подумал, что это может быть проблема с целевым местоположением.

1 Ответ

0 голосов
/ 01 июля 2019

Как я уже сказал в своем комментарии:

Для меня я мог бы просто использовать:

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