Подтвердить что ты не робот

PushAsync не поддерживается глобально на Android, пожалуйста, используйте NavigationPage - Xamarin.Forms

У меня есть следующий метод в Xamarin.Forms.ContentPage, подключенный к событию нажатия кнопки

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

В следующей строке кода Navigation.PushAsync(new HomePage()); во время отладки я получаю следующее исключение:

PushAsync не поддерживается глобально на Android, пожалуйста, используйте NavigationPage

Как решить эту проблему с помощью объекта Xamarin.Forms.NavigationPage?

4b9b3361

Ответ 1

Вы вызываете "PushAsync" :

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

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

но вы не запустили NavigationPage, который обычно выполняется в классе App.cs, или, по крайней мере, он должен быть запущен до любого вызова "PushAsync" :

MainPage = new NavigationPage(new PageA());

Ответ 2

В файле app.xaml.cs

Заменить

 MainPage = new <namespace>.MainPage();

С

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

Затем используйте

 await Navigation.PushAsync(new NavigationPage(new MainPage2()));

Ответ 3

Вам нужно приложить свой LoginPage в NavigationPage. Это исправит вашу ошибку, но оставит вас с LoginPage, содержащимся в вашем стеке навигации.

Альтернативным подходом было бы сделать ваш HomePage корневым приложением, а затем отобразить LoginPage на его основе. Только когда пользователь успешно войдет в систему, вы отпустите мода LoginPage, чтобы они могли видеть HomePage.

Ответ 4

Я изменяю только pushAsync с помощью 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

У меня возникла одна проблема при смешивании Rg.Plugins.Popup и ZXin.Net.Mobile Scanner.

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

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