Как выполнить навигацию из моего класса приложения, находясь в модели представления с Prism - PullRequest
1 голос
/ 06 марта 2019

В настоящее время я разрабатываю приложение, в котором у нас есть функция, называемая «подсказками», которые по сути являются микроблогами.В этих блогах, основанных на html, вы можете ссылаться на другой «Контент», который существует в нашем приложении, через обычные гиперссылки.

Приложение настроено на открытие схемы URL этих ссылок, и все платформы имеют свой собственный коднаправить новый URI в приложение форм xamarin через MessagingCenter, у которого есть подписчик внутри класса App, например:

 MessagingCenter.Subscribe(Current, DoshiMessages.NewUri, async (Application app, string uri) =>
 {
     var result = await HandleUriNavAsync(uri);

     if (!result)
        await Container.Resolve<IUserDialogs>().AlertAsync("Link was invalid");
 });

, который вызывает:

    private async Task<bool> HandleUriNavAsync(string uri)
    {
        if (uri == null)
            return false;

        await NavigationService.NavigateAsync(new Uri(uri, UriKind.Absolute));
        return true;
    }

Теперь это работает нормальнос абсолютным URI, но если я изменю его на

        //Example: uri = www.example.com/main/nav/test?userid=0
    private async Task<bool> HandleUriNavAsync(string uri)
    {
        if (uri == null)
            return false;

        //Example: relative = test?userid=0
        var relative = uri.Split('/').Last();
        await NavigationService.NavigateAsync(new Uri(relative, UriKind.Relative));
        return true;
    }

Навигация никогда не срабатывает, но не выдается никаких исключений, и задача успешно завершается (я проверил).Обратите внимание, что приведенный выше код выполняется, когда приложение уже запущено и уже имеет активные модели представления.

Есть ли что-то очевидное, что я делаю неправильно, и есть ли лучший способ добиться этого?

Cheers!

Ответы [ 2 ]

0 голосов
/ 10 марта 2019

Итак, я нашел обходной путь, который работает довольно хорошо.Это немного схематично, но, поскольку все мои модели представления наследуют общий базовый класс, я могу получить текущую модель просмотра с помощью Prism PageUtils

MessagingCenter.Subscribe(Current, DoshiMessages.NewUri, async (Application app, string uri) =>
{
    try
    {
        var relative = uri.Split('/').LastOrDefault();

        if(relative != null)
        {
            var currentVM = PageUtilities.GetCurrentPage(MainPage).BindingContext as ViewModelBase;
            await currentVM.HandleNewUriAsync(relative);
        }
    }
    catch(Exception ex)
    {
       Crashes.TrackError(ex);
    }
});

А затем просто выполнить навигацию в текущей модели представления

    public async Task HandleNewUriAsync(string uri)
    {
        await _navigationService.NavigateAsync(new Uri(uri, UriKind.Relative));
    }
0 голосов
/ 07 марта 2019

Я проверяю ваш код и получаю результат, как на следующем скриншоте, эта проблема связана с типом uri.

Вы установили UriKind.Absolute, поэтому тип uri должен быть www.example.com/main/nav/test?userid=0.

Если вы установите UriKind.Relative, после разделения URI, этот тип URI может быть установлен.

В конце, никакие исключения не генерируются в VS, это так проводной.enter image description here

...