在使用Prism的viewmodel中,如何从App类执行导航

问题描述 投票:1回答:2

我目前正在开发一个应用程序,其中我们有一个名为“提示”的功能,本质上是微博。在这些基于html的博客中,您可以通过普通的超链接链接到我们的应用程序中存在的其他“内容”。

该应用程序设置为打开这些链接的URL方案,并且所有平台都有自己的代码,通过MessagingCenter将新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;
    }

导航永远不会触发,但不会抛出异常并且任务成功完成(我已经检查过)。请注意,上面的代码在应用程序已经运行且已有活动的视图模型时执行。

有没有明显的东西,我做错了,是否有更好的方法来实现这一目标?

干杯!

xamarin.forms xamarin.android navigation uri prism
2个回答
0
投票

我测试你的代码并得到如下截图的结果,这个问题与uri类型有关。

你设置了UriKind.Absolute,所以你uri类型应该是www.example.com/main/nav/test?userid=0

如果你设置UriKind.Relative,在拆分uri之后,可以设置这种类型的uri。

最后,VS中没有引发异常,这是有线的。 enter image description here


0
投票

所以我最终找到了一个非常好的解决方法。这有点粗略,但因为我的所有视图模型都继承了一个公共基类,所以我可以在Prism PageUtils的帮助下获得当前的viewmodel

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));
    }
© www.soinside.com 2019 - 2024. All rights reserved.