【问题标题】:Xamarin Forms - Prism - OnNavigatedTo Calling TwiceXamarin Forms - Prism - OnNavigatedTo 调用两次
【发布时间】:2018-10-19 14:49:12
【问题描述】:

所以,我已经用 prism 开发了 2 个月的应用程序,现在我意识到当我从 MasterDetailPage 中选择一个项目时,方法 OnNavigatedTo 被调用了两次。

我不知道为什么会这样,我确定我遗漏了一些东西,但我大约需要两天时间才能解决它。

我会在这里放一些代码,如果你们需要更多信息,我可以发布更详细的信息。

观察:当我在页面“A”并且我在主从项目列表中选择页面“A”时,OnNavigatedTo 只被调用一次,但是当我在页面“B”并且我选择页面“A”,OnNavigatedTo 被调用了两次。

从现在开始,谢谢你们,对无知感到抱歉。

MasterDetailPage MVVM:

public class PrincipalMasterDetailPageViewModel : ViewModelBase {
        public ObservableCollection<PrincipalMasterPageItem> MenuItems { get; set; }

        public PrincipalMasterDetailPageViewModel(INavigationService navigationService) : base(navigationService)
        {
            MenuItems = new ObservableCollection<PrincipalMasterPageItem>();
        }
        public async override void OnNavigatedTo(NavigationParameters parameters) {
            base.OnNavigatedTo(parameters);
            .. Here I'm calling an API, thats why I have the async
        }
    }

自定义导航页面 MVVM:

public class PrincipalNavigationPageViewModel : ViewModelBase {
        public PrincipalNavigationPageViewModel(INavigationService navigationService) : base(navigationService) {
        }
    }

当我在 masterdetailpage 项目列表中选择项目时实际显示的页面:

public class NewPageTestViewModel : ViewModelBase
    {
        public NewPageTestViewModel(INavigationService navigationService) : base(navigationService)
        {

        }

        public override void OnNavigatedTo(NavigationParameters parameters)
        {
            base.OnNavigatedTo(parameters);
            Debug.WriteLine("Calling twice HERE!");
        }
    }

这三个例子的RegisterTypes:

    containerRegistry.RegisterForNavigation<PrincipalMasterDetailPage>();
containerRegistry.RegisterForNavigation<PrincipalNavigationPage>();
containerRegistry.RegisterForNavigation<NewPageTest>();

如何从 PrincipalMasterDetailPageViewModel 调用其他页面:

NavigationService.NavigateAsync(string.Format("PrincipalNavigationPage/{0}", item.TargetPageName));

在 App.cs 中我开始如下,因为我首先需要登录页面:

protected override async void OnInitialized()
        {
            InitializeComponent();

            await NavigationService.NavigateAsync("LoginPage");
        }

当用户登录时,它会像这样导航:

await NavigationService.NavigateAsync("/PrincipalMasterDetailPage/PrincipalNavigationPage/WhateverPageIWantTo");

【问题讨论】:

  • 如何在容器中注册视图以及如何调用NavigateTo?你能提供一些代码吗?
  • @Mardukar 当然,我已经用你想要的信息编辑了帖子。
  • 还没有工作... =[
  • 不,从 A 导航到 B:调用两次(无论我导航多少次)从 A 导航到 A:调用一次

标签: c# forms xamarin prism


【解决方案1】:

我不知道是否还有人对此感兴趣,但我遇到了同样的问题并弄清楚发生了什么。

我找到的所有代码示例都注册了这样的 NavigationPage:

containerRegistry.RegisterForNavigation<NavigationPage>("Navigation");

为了能够在应用启动时做这样的事情:

 NavigationService.NavigateAsync($"Main/Navigation/Home");

但是,问题似乎是,当实例化此 NavigationPage 时没有分配特定的 ViewModel 时,“INavigationAware”事件会以某种方式传播到 MasterDetailPage 的 ViewModel,从而导致该事件被调用两次。

我通过使用这样的 ViewModel 注册 NavigationPage 来修复它:

    containerRegistry.RegisterForNavigation<NavigationPage, NavigationPageViewModel>("Navigation");

ViewModel 本身并没有什么特别之处:

using Prism.Commands;
using Prism.Mvvm;
using Prism.Navigation;
using System;
using System.Collections.Generic;
using System.Linq;
using Unity.Attributes;

namespace SocialRecipe.ViewModels
{
    public class NavigationPageViewModel : ViewModelBase
    {
        public NavigationPageViewModel()
        {

        }

        public override void OnNavigatedFrom(INavigationParameters parameters)
        {
        }

        public override void OnNavigatedTo(INavigationParameters parameters)
        {
        }

        public override void OnNavigatingTo(INavigationParameters parameters)
        {
        }
    }
}

这样 NavigationPage 的事件被路由到 NavigationPageViewModel 并且不再传播到 MasterDetailPage...

【讨论】:

  • 感谢您的反馈和解释彼得,我认为它会完成这项工作,我会尽可能对其进行测试并分享它是否对我有用!
  • 成功了!在第二个Type中添加ViewModel后,它不再重复了
  • 经过几周的开发,我对这个问题有点恼火,但在今天之前还不足以真正深入研究它。它不是一个明显的解决方法,所以我相信你为我节省了数小时的研究时间。谢谢!
  • Welp,对我来说是个错误的问题,事实证明,我在 VM 构造函数中使用 EventAggregator 订阅了一个事件,并且构造函数被调用了两次并订阅了两次相同的事件。对我来说不同的问题。
【解决方案2】:

我注意到 Prism 的一些结果与之前的项目不一致。如果您现在只看到它并且它以前有效,我会尝试回溯以查看您使用的版本是否不同。

https://github.com/PrismLibrary/Prism/issues

【讨论】:

  • 我试试回溯,谢谢!我意识到刚才被调用了两次,项目大约70%,是我的错,但我希望它不是棱镜问题,因为它是一个很好的工具,如果我需要移除棱镜我会很难过来自项目。
猜你喜欢
  • 2018-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多