PushAsync wird unter Android nicht global unterstützt. Verwenden Sie eine Navigationsseite - Xamarin.Forms

77

Ich habe die folgende Methode in einem Xamarin.Forms.ContentPagemit einer Schaltfläche verbundenen Ereignis

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());
        }
    }
}

In der folgenden Codezeile Navigation.PushAsync(new HomePage());wird beim Debuggen die folgende Ausnahme angezeigt:

PushAsync wird unter Android nicht global unterstützt. Verwenden Sie eine Navigationsseite

Wie löse ich dieses Problem mithilfe eines Xamarin.Forms.NavigationPageObjekts?

Michael Kniskern
quelle

Antworten:

131

Sie rufen "PushAsync" auf :

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

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

Sie haben die Navigationsseite jedoch nicht gestartet, was normalerweise in der App.cs-Klasse erfolgt, oder sie sollte zumindest vor einem Aufruf von "PushAsync" gestartet werden :

MainPage = new NavigationPage(new PageA());
Leser Man San
quelle
Alles umsonst versucht, funktionierte dies wie ein Zauber (Build Android 6, emuliert auf LG G2 Android 4.4).
Anwar
Vielen Dank @Reader Man San
Muhammad Ramzan
1
MainPage = neue Navigationsseite (neue SeiteA ()); Arbeiten mit App, aber nicht mit ContentPage
Shweta Nandha
48

In der Datei app.xaml.cs

Ersetzen

 MainPage = new <namespace>.MainPage();

Mit

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

Dann benutze

 await Navigation.PushAsync(new NavigationPage(new MainPage2()));
Amar Mathur
quelle
1
Arbeite wie ein Zauber. Danke
GummyBear21
1
Sie müssen in PushAsync keine neue NaigationPage () verwenden. Sie können Navigation.PushAsync (neue MainPage2 ()) abwarten; Ein bisschen weniger Code :)
Eldlabs
Warten Sie auf Navigation.PushAsync (neue MainPage ()); funktioniert nicht mit ContentPage Ich erhalte System.InvalidOperationException: PushAsync wird unter Android nicht global unterstützt. Verwenden Sie eine Navigationsseite.
Shweta Nandha
2
Dies bringt das Design durcheinander, da oben auf der Seite eine Navigationsleiste hinzugefügt wird.
Ola Ström
15

Sie müssen Ihre LoginPage in eine NavigationPage einschließen. Dadurch wird Ihr Fehler behoben, Sie erhalten jedoch die auf Ihrem Navigationsstapel enthaltene LoginPage.

Ein alternativer Ansatz wäre, Ihre HomePage zum Stammverzeichnis der Anwendung zu machen und dann die LoginPage modal darüber anzuzeigen. Erst wenn sich der Benutzer erfolgreich anmeldet, schließen Sie das LoginPage-Modal, damit er die HomePage sehen kann.

Jason
quelle
Würde lege ich meine LoginPageinnerhalb einer NavigationPagein meiner App.GetMainPageMethode? Könnte ich auch die Methode 'Navigation.PopAsync ()' verwenden, um die Anmeldeseite vom Navigationsstapel zu entfernen?
Michael Kniskern
Ja, Sie machen NavPage zu Ihrer äußersten Seite. Ich glaube nicht, dass Sie PopAsync () verwenden können, wenn sich nur eine Seite auf dem Stapel befindet, aber ich habe es nicht ausprobiert.
Jason
Ein anderer Ansatz besteht darin, die LoginPageHauptseite für die Anwendung und PushModalAsynceine neue NavigationPagemit dem Inhalt der App bei erfolgreicher Anmeldung zu haben.
Stephane Delcroix
1
Der beste Ansatz ist, die App normal und PushModalAsync()die Anmeldeseite zu laden . Achten Sie nur darauf, dass der Benutzer die Hardware-Zurück-Taste unter Android nicht drückt. public override void OnBackPressed(){ if(user.IsAuthenticated(){base.OnBackPressed();}}
Chase Florell
Ich habe das gleiche Problem, wenn ich versuche, PushAsync auf einer modalen Seite aufzurufen. So etwas wie - PushAsync - PushModalAsync - PushAsync (hier habe ich das Problem und Ihre Problemumgehungen funktionieren nicht)
Alessandro Caliaro
9

Ich ändere pushAsync nur mit 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());
    }
}
TM
quelle
7

Nehmen Sie zuerst die Einstellung in "Haupt-App-Seite" und dann in "Inhaltsseite" vor, um zu einer anderen Seite zu gelangen:

Geben Sie hier die Bildbeschreibung ein

Abdul Khaliq
quelle
3
Dies bringt das Design durcheinander, da oben auf der Seite eine Navigationsleiste hinzugefügt wird.
Ola Ström
2

Ich habe ein Problem beim Mischen von Rg.Plugins.Popup und ZXin.Net.Mobile Scanner.

Das Aufrufen des Scanners in einem Popup löste denselben Fehler aus. PushModalAsync hat den Fehler behoben, aber das Popup war über dem Scan, sodass die einfache Lösung das Popup unsichtbar machte, bis der Scanner eingeschaltet war.

    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);
    }
Faruk A Feres
quelle
0

Stellen Sie sicher, dass auf der vorherigen Seite kein PushModalAsync verwendet wird. Wenn Sie später PushAsync verwenden, wird die Fehlermeldung "PushAsync wird unter Android nicht global unterstützt, verwenden Sie bitte eine Navigationsseite." Angezeigt.

Jorge Arturo
quelle
0

Überprüfen Sie, ob Sie in der vorherigen Navigation NavigationPage verwenden:

Falsch: Application.Current.MainPage = new LoginPage();

Richtig: Application.Current.MainPage = new NavigationPage(new LoginPage());

Maurico Flores
quelle
0

Wenn Sie hinzufügen (in " öffentliche Teilklassen-App "):

public App()
{
    InitializeComponent();

    MainPage = new NavigationPage(new MainPage());
}

Sie können verwenden:

Warten Sie auf Navigation.PushAsync (neues BleBleBle ());

Mariusz Baranski
quelle