【问题标题】:PushAsync is not supported globally on Android, please use a NavigationPage - Xamarin.FormsAndroid 全球不支持 PushAsync,请使用 NavigationPage - Xamarin.Forms
【发布时间】:2014-08-28 14:20:59
【问题描述】:

我在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());,调试时出现以下异常:

Android 全球不支持 PushAsync,请使用 导航页

如何使用Xamarin.Forms.NavigationPage 对象解决此问题?

【问题讨论】:

    标签: navigation xamarin xamarin.android xamarin.forms


    【解决方案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());
    

    【讨论】:

    • 徒劳无功,这就像一个魅力(构建 Android 6,在 LG G2 Android 4.4 上模拟)。
    • 感谢@Reader Man San
    • MainPage = new NavigationPage(new PageA());使用 App 但不使用 ContentPage
    • 有人应该制作一个 IDE,将错误警告与投票最多的 StackOverflow 答案配对
    【解决方案2】:

    在 app.xaml.cs 文件中,

    替换

     MainPage = new <namespace>.MainPage();
    

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

    然后使用

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

    【讨论】:

    • 像魅力一样工作。谢谢
    • 你不需要在 PushAsync 中使用 new NaigationPage()。您可以等待 Navigation.PushAsync(new MainPage2());少一点代码:)
    • 等待 Navigation.PushAsync(new MainPage());不使用 ContentPage 我得到 System.InvalidOperationException:PushAsync 在 Android 上不受全球支持,请使用 NavigationPage。
    • 这搞砸了设计,因为它在页面顶部添加了一个导航栏。
    • 导航栏是我们的用户希望看到的。 :)
    【解决方案3】:

    您需要将 LoginPage 包含在 NavigationPage 中。这将修复您的错误,但会给您留下导航堆栈中包含的 LoginPage。

    另一种方法是将您的主页设置为应用程序的根,然后在其顶部以模态方式显示 LoginPage。只有当用户成功登录后,您才会关闭 LoginPage 模式,以便他们可以看到主页。

    【讨论】:

    • 我会在我的App.GetMainPage 方法中将我的LoginPage 包含在NavigationPage 中吗?另外,我可以使用“Navigation.PopAsync()”方法从导航堆栈中删除登录页面吗?
    • 是的,您将 NavPage 设为最外层页面。当堆栈只有一页时,我认为您不能使用 PopAsync(),但我没有尝试过。
    • 另一种方法是将LoginPage作为应用程序的主页,并将PushModalAsync一个新的NavigationPage与成功登录的应用程序的内容。
    • 最好的方法是正常加载应用程序和PushModalAsync()登录页面。只要确保防止用户按下 Android 上的硬件后退按钮即可。 public override void OnBackPressed(){ if(user.IsAuthenticated(){base.OnBackPressed();}}
    • 当我尝试在模态页面中调用 PushAsync 时,我遇到了同样的问题。类似 - PushAsync - PushModalAsync - PushAsync (这里我有问题,你的解决方法不起作用)
    【解决方案4】:

    我只用 pushModalAsync 改变 pushAsync :)

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

    【讨论】:

    • PushModalAsync 有效,但它也摆脱了我们用户希望看到的顶部导航栏。
    【解决方案5】:

    首先在“主应用页面”中进行设置,然后在“内容页面”中进行设置以转到其他页面:

    【讨论】:

    • 这搞砸了设计,因为它在页面顶部添加了一个导航栏。
    【解决方案6】:

    检查在之前的导航中您使用的是 NavigationPage:

    不正确:Application.Current.MainPage = new LoginPage();

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

    【讨论】:

      【解决方案7】:

      当你添加(在“public partial class App”中):

      public App()
      {
          InitializeComponent();
      
          MainPage = new NavigationPage(new MainPage());
      }
      

      你可以使用:

      等待 Navigation.PushAsync(new BleBleBle());

      【讨论】:

        【解决方案8】:

        我在混合 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);
            }
        

        【讨论】:

          【解决方案9】:

          验证上一页没有使用 PushModalAsync。 如果稍后您使用 PushAsync,您将收到错误“Android 上不支持全球范围内的 PushAsync,请使用 NavigationPage。”

          【讨论】:

            【解决方案10】:

            由于您通常不希望登录成为页面堆栈的一部分或用户在正确验证后能够返回,因此您可以执行以下操作:

            在按下登录按钮时执行的方法内部

            Application.Current.MainPage = new NavigationPage(new HomePage());

            这将作为 NavigationPage 的主屏幕,而不是 LoginPage。此外,除非您放置一个退出按钮,否则用户将无法返回登录。

            【讨论】:

              猜你喜欢
              • 2020-05-21
              • 2018-11-18
              • 2017-12-19
              • 2020-05-04
              • 2018-01-13
              • 2019-08-14
              • 2017-08-26
              • 1970-01-01
              • 2018-06-12
              相关资源
              最近更新 更多