1
votes

OnNavigationPour ne pas déclencher dans XF Prism 7

J'ai parcouru plusieurs articles sur la navigation et le passage de paramètres avec prism. Cependant, rien de ce que j'essaye ne fera déclencher la méthode OnNavigatingTo lors du changement de page.

Mon objectif est de passer un paramètre simple de LoginPage à MultifactorAuthPage.

Si j'essaie d'obtenir le paramètre dans la méthode OnNavigatingTo, l'application ne changera pas de page pour une raison quelconque. Il atteindra le point d'arrêt et restera simplement sur la page de connexion.

J'utilise actuellement Xamarin Forms 3.6 avec Prism 7.1.

Voici une partie de mon code:

LoginPageViewModel

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)
    {

    }

}

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 LoginPageViewModel(INavigationService navigationService, IPushNotification pushNotification)
    {
        _navigationService = navigationService;
        LoginCommand = new DelegateCommand(BeginLoginAsync);
    }
    private async void BeginLoginAsync()
    {
        await _navigationService.NavigateAsync("MultifactorAuthPage", new NavigationParameters("PhoneNumber=9999999999"));
    }

Certaines des ressources que j'ai essayées:

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


4 commentaires

Faites-vous quelque chose de personnalisé en ce qui concerne l'enregistrement d'INavigationService avec le conteneur DI? La seule différence entre ma configuration, qui fonctionne, et la vôtre, d'après ce que je peux voir, est que je passe INavigationService au constructeur de base et que je le garde en tant que propriété protégée sur ViewModelBase.


Je ne pense pas. J'ai ceci dans mes types de registre: containerRegistry.RegisterForNavigation (); Et je fais cela dans App.cs: attendez NavigationService.NavigateAsync ("NavigationPage / LoginPage");


Avez-vous enregistré vos autres pages pour la navigation en utilisant containerRegistry.RegisterForNavigation ("LoginPage")


Oui. J'ai créé un nouvel exemple de projet et le code fonctionne. Je ne sais pas où se trouve la déconnexion dans mon projet.


3 Réponses :


0
votes

Votre méthode BeginLoginAsync est évidemment asynchrone. Par conséquent, vous devez également instancier la commande pour qu'elle soit asynchrone. Essayez ceci:

public override async void OnNavigatingTo(INavigationParameters parameters)
{
   ...
   base.OnNavigatingTo(parameters);
}

vous devez également changer la méthode BeginLoginAsync afin de renvoyer une Task au lieu de void code>.

private async Task BeginLoginAsync()
{
    await _navigationService.NavigateAsync("MultifactorAuthPage", new NavigationParameters("PhoneNumber=9999999999"));
}

Alors ça devrait aller.

MODIFIER: Essayez également de changer cette signature de méthode pour qu'elle soit asynchrone si vous devez attendre et n'oubliez pas de appeler les méthodes de base :

public LoginPageViewModel(INavigationService navigationService, IPushNotification pushNotification)
{
        _navigationService = navigationService;
        LoginCommand = new DelegateCommand(async () => await BeginLoginAsync());
}

J'espère aide et bon codage!


4 commentaires

Cela n'a malheureusement pas fonctionné. Il accède à la page multifactorielle correctement mais il ne déclenche pas l'événement. Bizarre


Vous manquez des appels à base.OnNavigatXXXXX (paramètres); dans chaque méthode


Ainsi, OnNavigatingTo et OnNavigatedTo sont frappés dans le LoginViewModel lorsque l'application se charge. Lorsque j'essaie d'aller à la page multi-facteurs, seule la méthode OnNavigatingTo est frappée (pas la méthode OnNaviagtedTo). Ensuite, si je clique sur la flèche de retour dans la barre de navigation, OnNavigatedTo est à nouveau frappé dans le LoginViewModel. Donc, quelque chose doit se passer avec mon MultifactorViewModel


Ces suggestions sont bonnes, mais ne répondent pas vraiment à la question. L'appel à base.OnNav ... n'aura aucun effet, il appellerait à des méthodes virtuelles vides. Les méthodes async void sont également parfaitement adaptées en tant que délégués passés dans des commandes, elles se comportent de la même manière que les gestionnaires d'événements async, l'autre cas où async void est acceptable.



0
votes

Il s'avère qu'il échouait silencieusement en raison du débordement de la valeur int. Les exceptions silencieuses sont des tueurs


3 commentaires

Vous pourriez envisager ici d'enregistrer une implémentation ILoggerFacade avec le conteneur DI. Prism effectue sa journalisation sur cette interface, il peut vous aider à diagnostiquer un grand nombre de problèmes de navigation qui échouent silencieusement.


Avez-vous des liens sur cette implémentation?


Prism définit l'interface ILoggerFacade: github.com/PrismLibrary/ Prism / blob / master / Source / Prism / Loggi‌ ng /… . Implémentez cette méthode Log unique sur une classe, enregistrez-la avec le conteneur du type de service ILoggerFacade, et Prism utilisera cette classe pour la journalisation interne. Mon implémentation prend mon "vrai" enregistreur comme une dépendance, et appelle le "vrai" enregistreur.



0
votes

Question si vieille, mais je me battais avec un problème similaire aujourd'hui, et mon problème était une sorte d'exception silencieuse. Je vais donc partager mon problème et ma solution, peut-être aider.

Dans mon cas, j'ai une méthode d'initialisation de viewModel qui est associée à une commande pour faire des "réinitialisations" en réponse aux actions de l'utilisateur à l'intérieur de la page. Ainsi, cette méthode est appelée à l'intérieur de "OnNavigateTo" et peut être appelée par une commande en réponse aux actions de l'utilisateur. Mais OnNavigateTo ne déclenchait pas ...

Comme ma méthode d'initialisation reçoit un paramètre int32, j'ai d'abord eu une commande déléguée comme celle-ci:

 public DelegateCommand<int?> DoInitialization{ get; set; }

Le problème pour moi, c'était avec l'instanciation de commande dans le constructeur viewModel: il a échoué en silence et le code s'arrête, et la raison en est que vous ne pouvez utiliser que des types de référence avec des commandes, j'ai donc changé mon DelegateCommand en:

 public DelegateCommand<int> DoInitialization{ get; set; }

... le rendre nullable suffit pour avoir un type de référence, et le problème disparaît. Oui, c'est évident pour les programmeurs xamarin / prism expérimentés, mais pas pour les débutants comme moi, car vous ne recevez aucune exception.

Cordialement.


0 commentaires