1
votes

Navigation.PushAsync ne semble pas afficher la page suivante bien qu'il frappe le constructeur

Je crée une application Xamarin multipages qui permet à l'utilisateur de se connecter et d'afficher les emplacements de cet utilisateur.

Je peux afficher l'écran de connexion, l'utilisateur peut toutefois se connecter via des appels à une base de données locale lorsque J'essaie d'utiliser Navigation.PushAsync pour aller à la page suivante, bien que frapper le constructeur pour la page suivante, rien ne semble se produire.

Je pense que cela peut avoir quelque chose à faire avec cette section de code ici.

Login.xaml.cs

<StackLayout>
    <ListView ItemsSource="{Binding Locations}"
              ItemSelected="Locations_ItemSelected"
              x:Name="listView">
        <ListView.RowHeight>
            <OnPlatform x:TypeArguments="x:Int32">
                <On Platform="iOS">100</On>
                <On Platform="Android">100</On>
            </OnPlatform>
        </ListView.RowHeight>
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="100"></RowDefinition>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto"></ColumnDefinition>
                            <ColumnDefinition Width="*"></ColumnDefinition>
                        </Grid.ColumnDefinitions>
                        <Image Source="{Binding Image}"
                                Aspect="AspectFill" Grid.ColumnSpan="2"></Image>
                        <Label Margin="5" 
                                Text="{Binding Name}"
                                VerticalTextAlignment="Center"
                                HorizontalTextAlignment="Start"
                                Grid.Row="0"
                                Grid.Column="0"
                                TextColor="White"
                                FontSize="25"></Label>
                        <Label Text="{Binding LocationID}"
                               IsVisible="False"></Label>
                    </Grid>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</StackLayout>

J'ai défini le Login comme ma page principale dans App.xaml.cs mais dans le constructeur, j'ai défini le contexte de liaison sur une classe appelée _login. Cette classe obtient et définit l'e-mail et le mot de passe de l'utilisateur lorsqu'il se connecte et appelle une solution externe pour accéder à la base de données sql. (Tout cela fonctionne correctement).

Sur le bouton login tel que celui-ci:

Login.xaml

    public async void LoginSuccessful(ApplicationUser user)
    {
        // Go to home page
        await Navigation.PushAsync(new MainPage
        {
            BindingContext = user
        });
    }


2 commentaires

pourquoi OnSubmit crée-t-il une nouvelle instance de connexion? Est-ce votre page Login.xaml, ou une classe d'assistance différente?


@Jason J'avais besoin d'accéder à la méthode LoginSuccessful afin de pouvoir naviguer de la page suivante à partir de ma compréhension, vous ne pouvez pas utiliser Navigation dans une classe. Ou est-ce incorrect? Non, le pourrait dans lequel cela se trouve est une classe appelée _logn qui est référencée à partir de login.xaml.cs comme indiqué dans le code ci-dessus. Lorsque l'utilisateur clique sur le bouton de connexion, il frappe la SubmitCommand qui effectue la connexion.


3 Réponses :


0
votes

Très probablement d'après le comportement que vous décrivez (et en regardant votre code), il semble que ce soit parce que PushAsync n'est pas exécuté sur le thread de l'interface utilisateur, ce qui oblige l'application à charger la page sur un thread séparé. Donc, votre application est probablement, elle lance simplement la page sur un autre fil de discussion.

Essayez de la changer comme suit:

Device.BeginInvokeOnMainThread(() =>
{
    Navigation.PushAsync(new MainPage
    {
        BindingContext = user
    });
});

Faites-moi savoir si cela a du sens.


0 commentaires

2
votes

vous créez ici une NOUVELLE instance de la page de connexion. Vous souhaitez utiliser l'instance EXISITNG qui est déjà affichée pour l'utilisateur

var nav = (NavigationPage)Application.Current.MainPage;
var login = (Login)nav.CurrentPage;

il existe de nombreuses façons différentes d'aborder cela, mais la plus simple est probablement

var login = (Login)Application.Current.MainPage;

if(response.WasSuccessful == true)
{
  login.LoginSuccessful(response.User);

ou si votre MainPage est une NavigationPage

Login login = new Login();

if(response.WasSuccessful == true)
{
  login.LoginSuccessful(response.User);


4 commentaires

Bonjour Jason, je reçois une erreur sur cette ligne (Login) Application.Current.MainPage; indiquant que la distribution spécifiée n'était pas valide


La connexion est-elle enveloppée dans une NavigationPage? Si tel est le cas, vous devez effectuer un cast vers NavigationPage, puis obtenir une connexion à partir de cela.


Oui, dans App.xaml.cs j'ai les éléments suivants: MainPage = new NavigationPage (new Login ());


Ouais. Ça semble avoir été ça



0
votes

Dans mon cas, cela s'est produit parce que j'ai accidentellement poussé la page de connexion en tant que Modal sur la pile de navigation. Sur cette page de connexion (modale), j'avais un bouton "Register" qui a déclenché un pushAsync sur la pile de navigation. La page "n'a pas montré" bien que j'aie vu son sur la pile de navigation dans le débogage parce que le modal était toujours au-dessus.

La solution dans ce cas était simplement de ne pas pousser la page de connexion en tant que modale sur la pile de navigation.


0 commentaires