简体   繁体   English

Xamarin - 不能使用 PopModalAsync

[英]Xamarin - Cannot use PopModalAsync

I am trying to use PopModalAsync to remove the modal page.我正在尝试使用PopModalAsync删除模态页面。 However, the Navigation.ModalStack.Count is 0. If I use PopModalAsync , it will throw an exception:但是, Navigation.ModalStack.Count是 0。如果我使用PopModalAsync ,它会抛出异常:

System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index

I am using Xamarin.Forms .我正在使用Xamarin.Forms Here is some sample code:下面是一些示例代码:

App.cs (Potable) App.cs(便携式)

public class App : Application
{
    public App()
    {
        // The root page of your application
        MainPage = new View.LoginPage();
    }
}

LoginPage.xaml.cs (Potable) LoginPage.xaml.cs(便携式)

public partial class LoginPage : ContentPage
{
    public INavigation _Navigate;
    public LoginPage()
    {
        InitializeComponent();
        _Navigate = Navigation;
    }

    async void LoginBtnClicked(object sender, EventArgs args)
    {
        await _Navigate.PushModalAsync(new AuthenicationBrowser());
        //await _Navigate.PopModalAsync(); it is work at here
        Debug.WriteLine("Navigation.NavigationStack  LoginBtnClicked ===> {0}", Navigation.NavigationStack.Count); //getting 0
         Debug.WriteLine("Navigation.ModalStack  LoginBtnClicked ===> {0}", Navigation.ModalStack.Count);  // getting 1    
    }

    public async void PopModal()
    {
        Debug.WriteLine(Navigation.NavigationStack.Count);
        await Navigation.PopModalAsync();
    }



}

AuthenicationBrowser.cs (Potable) * Edited: Put PopModalAsync * AuthenicationBrowser.cs(便携式* 编辑:PopModalAsync *

public partial class AuthenicationBrowser : ContentPage
{
    public AuthenicationBrowser()
    {
      InitializeComponent();
    }
    public async void PopModal()
    {
       Debug.WriteLine("Navigation.ModalStack  AuthenicationBrowser .PopModal===> {0}", Navigation.ModalStack.Count);  // getting 0    
       await Navigation.PopModalAsync();
    }
}

BrowserView.cs (Potable) BrowserView.cs(便携式)

public class BrowserView : WebView
{
    public BrowserView()
    {

    }
}

AuthenicationBrowserRenderer.cs (Droid) * Edited: Calling PopModal * AuthenicationBrowserRenderer.cs (Droid) * 编辑:调用 PopModal *

  [assembly: ExportRenderer(typeof(BrowserView), typeof(AuthenicationBrowserRenderer))] 
 namespace App.Droid
 {
     class AuthenicationBrowserRenderer : WebViewRenderer
     {
       ... // Doing some Auth in OnElementChanged and using JavaScriptCallBack class after received json in Webview
     }
     public class JavaScriptCallBack: Java.Lang.Object, IValueCallback
     {
        public JavaScriptCallBack()
        {

        }
        public async void OnReceiveValue(Java.Lang.Object result)
        {
            Java.Lang.String json = (Java.Lang.String)result;
            string raw_json = json.ToString();
            Debug.WriteLine("raw_json  ====>>> {0}", raw_json);
            var login_page = new LoginPage();
            var auth_page = new AuthenicationBrowser();

            Debug.WriteLine(login_page.Navigation.ModalStack.Count); // getting 0
            Debug.WriteLine(auth_page.Navigation.ModalStack.Count); // getting 0
            auth_page.PopModal(); // Trying to do PopModalAsync 


         }
     }
 }

Finally, I may get the answer that App.Current.MainPage.Navigation.PopModalAsync();最后,我可能会得到App.Current.MainPage.Navigation.PopModalAsync();的答案App.Current.MainPage.Navigation.PopModalAsync(); can do the trick.可以做到这一点。 The reason is that the new LoginPage() is called as a new Content Page not existing page.原因是new LoginPage()被称为新的Content Page而不是现有页面。

If I call it from the App.Current.MainPage (The existing LoginPage), it can get the existing modal from Modal Stack.如果我从App.Current.MainPage (现有的 LoginPage)调用它,它可以从 Modal Stack 获取现有的模态。

So the solution can be :所以解决方案可以是:

    public partial class LoginPage : ContentPage
    {

        public LoginPage()
        {
            InitializeComponent();

        }


        async void LoginBtnClicked(object sender, EventArgs args)
        {
            await Navigation.PushModalAsync(new AuthenicationBrowser());
        }

        public async void PopModal()
        {

            Debug.WriteLine("Navigation.ModalStack  PopModal ===> {0}", App.Current.MainPage.Navigation.ModalStack.Count);
            await App.Current.MainPage.Navigation.PopModalAsync();

        }



    }

As it seems you had the wrong Navigation object.看来您使用了错误的Navigation对象。 In my case I also had this wrong.就我而言,我也犯了这个错误。

I displayed a modal page, which had it's own navigation bar (or Navigation object).我显示了一个模态页面,它有自己的导航栏(或导航对象)。 So when I wanted to dismiss this modal page I got the mentioned exception, because there were no other pages on the navigation stack.所以当我想关闭这个模态页面时,我得到了提到的异常,因为导航堆栈上没有其他页面。 It was the wrong object ...这是错误的对象......

对我来说,当我应该调用 PushAsync 时,我正在调用 PushModalAsync 没有要推送 PushModelAsync 的项目

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM