web-dev-qa-db-fra.com

PushAsync n’est pas supporté globalement sur Android, veuillez utiliser une page de navigation - Xamarin.Forms

J'ai la méthode suivante dans un événement Xamarin.Forms.ContentPage Relié à un clic de bouton

public class LoginPage : ContentPage
{
    private Button _loginButton = null;
    private Entry _PasswordInput = null;
    private Entry _UsernameInput = null;

    public LoginPage()
    {
        _UsernameInput = new Entry { Placeholder = "Username" };
        _PasswordInput = new Entry { Placeholder = "Password", IsPassword = true };

        _loginButton = new Button
        {
            Text = "Login",
            BorderRadius = 5
        }

        _loginButton.Clicked += LogIn;

        Content = new StackLayout 
        {
            VerticalOptions = LayoutOptions.Center,
            Children = 
            {
                 _UsernameInput, _PasswordInput, _loginButton, 
            },
            Spacing = 15
        };
    }

    public async void LogIn(object sender, EventArgs eventsArgs)
    {
        //do authenticate stuff here
        SSO.MyAuthentication client = new SSO.MyAuthentication();

        bool isAuthenticated = client.Authenticate(_UsernameInput.Text, _PasswordInput.Text);

        if(isAuthenticated)
        {
             //Push home page to top of navigation stack
             Navigation.PushAsync(new HomePage());
        }
    }
}

Sur la ligne de code suivante Navigation.PushAsync(new HomePage());, je reçois l'exception suivante lors du débogage:

PushAsync n’est pas supporté globalement sur Android, utilisez une page de navigation.

Comment résoudre ce problème en utilisant un objet Xamarin.Forms.NavigationPage?

50
Michael Kniskern

Vous appelez "PushAsync":

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
    }

    private void btnCourseList_Clicked(object sender, EventArgs e)
    {
        Navigation.PushAsync(new PageB());
    }
}

mais vous n'avez pas lancé la NavigationPage, qui est normalement effectuée dans la classe App.cs, ou du moins, elle devrait être lancée avant tout appel à "PushAsync":

MainPage = new NavigationPage(new PageA());
98
Reader Man San

Dans le fichier app.xaml.cs,

Remplacer

 MainPage = new <namespace>.MainPage();

Avec

 MainPage = new NavigationPage(new <namespace>.MainPage());

Puis utiliser

 await Navigation.PushAsync(new NavigationPage(new MainPage2()));
26
Amar Mathur

Vous devez inclure votre LoginPage dans une NavigationPage. Cela corrigera votre erreur, mais vous laissera la LoginPage contenue dans votre pile de navigation.

Une autre approche serait de faire de votre page d'accueil la racine de l'application, puis d'afficher modalement la page de connexion au-dessus. Lorsque l'utilisateur se connecte avec succès, vous fermez le modal LoginPage afin qu'il puisse voir la page d'accueil.

13
Jason

Je ne change que pushAsync avec pushModalAsync :)

public async void LogIn(object sender, EventArgs eventsArgs)
{
    //do authenticate stuff here
    SSO.MyAuthentication client = new SSO.MyAuthentication();

    bool isAuthenticated = client.Authenticate(_UsernameInput.Text, _PasswordInput.Text);

    if(isAuthenticated)
    {
         //Push home page to top of navigation stack
         //Navigation.PushAsync(new HomePage());
           Navigation.PushModalAsync(new HomePage());
    }
}
5
T M

J'ai résolu ce problème. D'abord, définissez les paramètres dans "Page principale de l'application" puis dans "Page de contenu" pour accéder à une autre page.

enter image description here

0
Ayaat Shifa

J'ai un problème en mélangeant Rg.Plugins.Popup et ZXin.Net.Mobile Scanner.

L'appel du scanner dans un popup provoquait cette même erreur. PushModalAsync a résolu l'erreur, mais la fenêtre contextuelle étant terminée, la solution facile était de la rendre invisible jusqu'à ce que le scanner soit activé.

    private async void FrmQrCode_Tapped(object sender, EventArgs e)
    {
        ZXingScannerPage scanPage = new ZXingScannerPage();
        scanPage.OnScanResult += (result) =>
        {
            scanPage.IsScanning = false;
            ZXing.BarcodeFormat barcodeFormat = result.BarcodeFormat;
            string type = barcodeFormat.ToString();
            Device.BeginInvokeOnMainThread(() =>
            {
                Navigation.PopModalAsync();

                this.IsVisible = true;

                Token = result.Text.Trim();
            });
        };
        this.IsVisible = false;
        await Navigation.PushModalAsync(scanPage);
    }
0
Faruk A Feres