Xamarin Forms - Prism - OnNavigatedTo Вызов дважды - PullRequest
0 голосов
/ 09 мая 2018

Итак, я разрабатывал приложение в течение 2 месяцев с помощью призмы, и только сейчас я понял, что метод OnNavigatedTo вызывается дважды, когда я выбираю элемент из MasterDetailPage.

Понятия не имею, почему это происходит, я уверен, что что-то упустил, но я около двух дней пытаюсь это решить.

Я добавлю сюда код, и если вам, ребята, понадобится больше информации, я могу опубликовать более подробно.

Наблюдение: когда я нахожусь на странице «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!");
        }
    }

Типы регистра этих трех примеров:

    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");

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Я не знаю, заинтересован ли кто-нибудь еще в этом, но я столкнулся с той же проблемой и выяснил, что происходит.

Все примеры кода, которые я нашел, регистрируют страницу навигации следующим образом:

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

Чтобы иметь возможность сделать что-то подобное при запуске приложения:

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

Однако проблема, по-видимому, заключается в том, что когда создается экземпляр NavigationPage без привязки к нему конкретной ViewModel, события INavigationAware каким-то образом передаются в ViewModel MasterDetailPage, что приводит к тому, что события на этом объекте будут вызываться дважды.

Я исправил это, зарегистрировав NavigationPage для навигации с помощью ViewModel следующим образом:

    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…

0 голосов
/ 09 мая 2018

Я заметил некоторые противоречивые результаты и с Prism из предыдущего проекта. Если вы видите это только сейчас, и оно работало ранее, я бы попытался вернуться, чтобы увидеть, была ли другая версия, которую вы использовали.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...