PushAsync не підтримується глобально на Android, використовуйте сторінку навігації - Xamarin.Forms


78

У мене є такий спосіб, пов’язаний із 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, використовуйте сторінку навігації

Як вирішити цю проблему за допомогою Xamarin.Forms.NavigationPageоб’єкта?

Відповіді:


134

Ви телефонуєте "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());

Даремно спробувавши все, це спрацювало як шарм (побудувати Android 6, емульований на LG G2 Android 4.4).
Anwar,

Дякую @Reader Man San
Мухаммед Рамзан

1
MainPage = нова сторінка навігації (нова сторінка A ()); робота з додатком, але не робота з ContentPage
Швета Нандха,

50

У файлі app.xaml.cs

Замінити

 MainPage = new <namespace>.MainPage();

С

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

Потім використовуйте

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

1
Працюйте як оберіг. Дякую
GummyBear21,

1
Вам не потрібно використовувати new NaigationPage () всередині PushAsync. Ви можете очікувати Navigation.PushAsync (new MainPage2 ()); Трохи менше коду :)
Eldlabs,

чекають Navigation.PushAsync (new MainPage ()); не працює з ContentPage, я отримую System.InvalidOperationException: PushAsync не підтримується глобально на Android, будь ласка, використовуйте NavigationPage.
Швета Нандха,

2
Це зіпсує дизайн, оскільки він додає панель навігації у верхній частині сторінки.
Ola Ström

15

Вам потрібно вкласти свою сторінку LoginPage у сторінку навігації. Це виправить вашу помилку, але залишить вам сторінку LoginPage, яка міститься у вашому навігаційному стеку.

Альтернативним підходом було б зробити свою домашню сторінку коренем програми, а потім відобразити модульну сторінку LoginPage поверх неї. Тільки коли користувач успішно входить в систему, ви відхиляєте модаль LoginPage, щоб вони могли бачити HomePage.


Чи міг би я вкласти своє LoginPageв a NavigationPageу свій App.GetMainPageметод? Крім того, чи можу я використати метод 'Navigation.PopAsync ()', щоб видалити сторінку входу зі стеку навігації?
Michael Kniskern

Так, ви робите NavPage своєю зовнішньою сторінкою. Я не думаю, що ви можете використовувати PopAsync (), коли у стеку є лише одна сторінка, але я не пробував.
Джейсон

Інший підхід полягає в тому, щоб мати LoginPageголовну сторінку програми та PushModalAsyncнову NavigationPageіз вмістом програми при успішному вході в систему.
Stephane Delcroix

1
Найкращий підхід - це нормальне завантаження програми та PushModalAsync()сторінки входу. Тільки не забудьте заблокувати користувачеві натискання апаратної кнопки назад на Android. public override void OnBackPressed(){ if(user.IsAuthenticated(){base.OnBackPressed();}}
Чейз Флорелл

У мене така сама проблема, коли я намагаюся зателефонувати PushAsync на модальній сторінці. Щось на зразок - PushAsync - PushModalAsync - PushAsync (тут у мене проблема, і ваші обхідні шляхи не працюють)
Алессандро Каляро

9

Я змінюю лише 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());
    }
}

7

Спочатку зробіть налаштування в "Основній сторінці додатка", а потім у "Сторінці вмісту" перейдіть на іншу сторінку:

введіть тут опис зображення


3
Це зіпсує дизайн, оскільки він додає панель навігації у верхній частині сторінки.
Ola Ström

2

У мене одна проблема зі змішуванням 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);
    }

2

Переконайтеся, що в попередній навігації ви використовуєте NavigationPage:

Неправильно: Application.Current.MainPage = new LoginPage();

Правильно: Application.Current.MainPage = new NavigationPage(new LoginPage());


1

Переконайтеся, що на попередній сторінці не використовується PushModalAsync. Якщо пізніше ви використовуєте PushAsync, ви отримаєте помилку "PushAsync не підтримується глобально на Android, використовуйте сторінку навігації."


1

Коли ви додаєте (у " публічному частковому класі App "):

public App()
{
    InitializeComponent();

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

Ви можете використовувати:

чекають Navigation.PushAsync (новий BleBleBle ());

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.