OnNavigatingTo 在 XF Prism 7 中未触发

Posted

技术标签:

【中文标题】OnNavigatingTo 在 XF Prism 7 中未触发【英文标题】:OnNavigatingTo not firing in XF Prism 7 【发布时间】:2019-09-12 05:03:09 【问题描述】:

我已经阅读了多篇关于使用 prism 进行导航和传递参数的文章。但是,我尝试的任何方法都不会在更改页面时触发 OnNavigatingTo 方法。

我的目标是将一个简单的参数从 LoginPage 传递到 MultifactorAuthPage。

如果我尝试在 OnNavigatingTo 方法中获取参数,您的应用将不会因某种原因更改页面。它将到达断点并停留在 LoginPage 上。

我目前正在使用 Xamarin Forms 3.6 和 Prism 7.1。

这是我的一些代码:

LoginPageViewModel

    public LoginPageViewModel(INavigationService navigationService, IPushNotification pushNotification)
    
        _navigationService = navigationService;
        LoginCommand = new DelegateCommand(BeginLoginAsync);
    
    private async void BeginLoginAsync()
    
        await _navigationService.NavigateAsync("MultifactorAuthPage", new NavigationParameters("PhoneNumber=9999999999"));
    

MultifactorAuthViewModel

public class MultifactorAuthPageViewModel : ViewModelBase, INavigationAware

    INavigationService _navigationService;

    public MultifactorAuthPageViewModel(INavigationService navigationService)
    
        _navigationService = navigationService;
    

    private override void OnNavigatingTo(INavigationParameters parameters)
    

    

    private override void OnNavigatedFrom(INavigationParameters parameters)
    

    

    private override void OnNavigatedTo(INavigationParameters parameters)
    
        PhoneNumber = Convert.ToInt32(parameters["PhoneNumber"]);
    


ViewModelBase

public class ViewModelBase : BindableBase, INavigationAware


    public ViewModelBase()
    
    

    public virtual void OnNavigatedFrom(INavigationParameters parameters)
    

    

    public virtual void OnNavigatedTo(INavigationParameters parameters)
    

    

    public virtual void OnNavigatingTo(INavigationParameters parameters)
    

    


我尝试过的一些资源:

https://prismlibrary.github.io/docs/xamarin-forms/navigation/passing-parameters.html https://xamgirl.com/prism-in-xamarin-forms-step-by-step-part-2/ https://github.com/PrismLibrary/Prism-Samples-Forms/tree/master/ContosoCookbook

【问题讨论】:

您是否在做任何自定义的事情,例如向 DI 容器注册 INavigationService?从我所看到的情况来看,我的设置和你的设置之间的唯一区别是我将 INavigationService 向下传递到基本构造函数中,并将其作为 ViewModelBase 上的受保护属性。 我不这么认为。我的注册类型中有这个: containerRegistry.RegisterForNavigation();我在 App.cs 中执行此操作:await NavigationService.NavigateAsync("NavigationPage/LoginPage"); 您是否使用containerRegistry.RegisterForNavigation<LoginPage, LoginPageViewModel>("LoginPage")注册了其他页面进行导航 是的。我创建了一个新的示例项目并且代码有效。我不确定我的项目中的断开连接在哪里。 【参考方案1】:

您的BeginLoginAsync 方法显然是异步的。因此,您还需要将命令实例化为异步的。试试这个:

public LoginPageViewModel(INavigationService navigationService, IPushNotification pushNotification)

        _navigationService = navigationService;
        LoginCommand = new DelegateCommand(async () => await BeginLoginAsync());

您还需要更改BeginLoginAsync 方法以返回Task 而不是void

private async Task BeginLoginAsync()

    await _navigationService.NavigateAsync("MultifactorAuthPage", new NavigationParameters("PhoneNumber=9999999999"));

那你应该没事。

编辑: 如果您必须等待并且不要忘记调用基本方法,也可以尝试将此方法签名更改为异步:

public override async void OnNavigatingTo(INavigationParameters parameters)

   ...
   base.OnNavigatingTo(parameters);

希望它对您有所帮助并祝您编码愉快!

【讨论】:

不幸的是,这不起作用。它可以很好地导航到多因素页面,但不会触发事件。奇怪 你错过了对 base.OnNavigatXXXXX(parameters) 的调用;在每个方法中 所以当应用程序加载时 OnNavigatingTo 和 OnNavigatedTo 在 LoginViewModel 中被击中。当我尝试进入多因素页面时,只有 OnNavigatingTo 方法被命中(而不是 OnNaviagtedTo)。然后,如果我单击导航栏中的后退箭头,则会在 LoginViewModel 中再次点击 OnNavigatedTo。所以我的 MultifactorViewModel 一定有问题 这些建议很好,但并没有真正解决问题。调用 base.OnNav... 不会有任何效果,他会调用空虚方法。作为传递给命令的委托,async void 方法也非常好,它们的行为与 async 事件处理程序相同,在另一种情况下 async void 是可以接受的。【参考方案2】:

事实证明,由于 int 值溢出,它默默地失败了。无声的异常是杀手

【讨论】:

您可能会在此处考虑使用 DI 容器注册 ILoggerFacade 实现。 Prism 会针对该界面进行日志记录,它可以帮助您诊断许多无提示失败的导航问题。 你有那个实现的链接吗? Prism 定义了 ILoggerFacade 接口:github.com/PrismLibrary/Prism/blob/master/Source/Prism/Logging/…。在一个类上实现该单个 Log 方法,将其注册到服务类型 ILoggerFacade 的容器中,Prism 将使用该类进行内部日志记录。我的实现将我的“真实”记录器作为依赖项,并调用“真实”记录器。【参考方案3】:

这么老的问题,但我今天也遇到了类似的问题,我的问题是某种无声的异常。所以我会分享我的问题和解决方案,也许会有所帮助..

在我的例子中,我有一个 viewModel 初始化方法,它与一个命令配对,以响应页面内的用户操作来执行“重新初始化”。因此,该方法在“OnNavigateTo”内部调用,并且可以通过命令调用以响应用户操作。但是 OnNavigateTo 没有触发...

当我的初始化方法接收一个 int32 参数时,首先我有一个这样的委托命令:

 public DelegateCommand<int> DoInitialization get; set; 

对我来说,问题在于 viewModel 构造函数中的命令实例化:它静默失败并且代码停止,原因是您只能将引用类型与命令一起使用,因此,我将 DelegateCommand 更改为:

 public DelegateCommand<int?> DoInitialization get; set; 

... 使其可为空就足以拥有引用类型,问题就消失了。是的,对于有经验的 xamarin/prism 程序员来说是显而易见的,但对于像我这样的新手来说却不是,因为你没有收到任何异常。

问候。

【讨论】:

以上是关于OnNavigatingTo 在 XF Prism 7 中未触发的主要内容,如果未能解决你的问题,请参考以下文章

System.err:TypeError:无法读取未定义的属性“onNavigatingTo”

Prism for Xamarin Forms - 从标签页导航

prism图怎么显示数据

WPF PRISM开发入门一

Prism -- 简介

从PRISM开始学WPFPrism?