popAsync导致参数outofrangeException



我是Xamarin.Forms的新手。我在出现的主页上有一个非常简单的功能

async public Task BaseAppearing()
    {
        if (UserID == null)
        {
            var page = new LoginPage();
            await App.Navigate(page);
        }
        else
        {
            stopWatch.Restart();
        }
    }

现在,登录页面显示正确,问题是在我单击登录时的登录页面中,我尝试弹出导航堆栈,我会收到以下错误

未经治疗的例外:

system.argumentOutOfrangeException:索引超出范围。必须是 非负数且小于集合的大小。参数名称: 索引

和应用程序崩溃。

例外仅发生在Android(模拟器和真实(中。在UWP中,它可以正常工作

弹出代码也很简单

public static Task PopNavigation()
    {
        var nav = Current.MainPage.Navigation;
        Task ret;
        try
        {
            ret = nav.PopAsync();
        }
        catch (Exception ex)
        {
            ex.Log();
            ret = Navigate(Current.MainPage);
        }
        return ret;
    }

不仅会抛出错误,而且永远不会达到异常处理程序。

另外,我已经读到,有时导航堆栈被损坏/空。但是不,NavigationStack有2个项目。主页和登录页,我认为这是正确的

所有导航都在同一堆栈上发生,因为我在应用程序中只有1个导航功能,这就是我曾经要求导航

请建议可以做什么

更新我试图将代码更改为使用NavigationPage如下所示,但没有帮助(我也有2个标题栏,顶部(

public async static Task Navigate(Page Page)
    {
        //await Current.MainPage.Navigation.PushAsync( Page);
        await Current.MainPage.Navigation.PushAsync( new NavigationPage( Page));
    }

如果这可能会对某人有所帮助,这是我的堆栈跟踪

在system.collections.generic.list`1 [t] .get_item(system.int32( 索引([0x00009]在 /users/builder/jenkins/workspace/xamarin-android-d15-9/xamarin-android/external/nono/mono/external/corefx/src/common/src/src/corelib/corelib/corelib/system/collections/collections/generic/generic/generic/generic/generic/list.cs:180 在 xamarin.forms.platform.android.appcompat.navigationpagerenderer.getFragment (xamarin.forms.page页面,system.boolean删除,系统。 poptoroot([0x00003]在 D: a 1 S Xamarin.forms.platform.android AppCompat navigationpagerenderer.cs:865 在 xamarin.forms.platform.android.appcompat.navigationpagerenderer.switchcontentasync (xamarin.forms.page页面,system.boolean动画,system.boolean 删除,system.boolean poptoroot([0x0001a] in D: A 1 S Xamarin.forms.platform.android AppCompat navigationPagerenderer.cs:768 在 xamarin.forms.platform.android.appcompat.navigationpagerenderer.onpopviewasync (xamarin.forms.page页面,system.boolean动画([0x00017]在 D: A 1 S Xamarin.forms.platform.android AppCompat NavigationPagerenderer.cs:592 在 xamarin.forms.platform.android.appcompat.navigationpagerenderer.popviewasync (xamarin.forms.page页面,system.boolean动画([0x00000]在 D: a 1 S Xamarin.forms.platform.android AppCompat navigationpagerenderer.cs:154 在 xamarin.forms.platform.android.appcompat.navigationpagerenderer.onpopped (System.Object发件人, xamarin.forms.internals.navigationrequestedeventargs e([0x00000] D: A 1 S Xamarin.forms.platform.android AppCompat navigationPagerenderer.cs:573 在 Xamarin.Forms.NavigationPage d__69.movenext (([0x0004c]在d: a 1 s s xamarin.forms.core navigationpage.cs:297中 ---堆叠跟踪的结尾从以前的位置抛出了例外的位置--- xamarin.forms.navigationpage d__68.movenext(( [0x0004c]在d: a 1 s xamarin.forms.core navigationpage.cs中:280 (([0x000cb]在d: a 1 s s xamarin.forms.core navigationpage.cs:168中 ---堆栈跟踪的结尾是从上一个位置抛出例外的位置---在qleeg.loginpage d__2.movenext(( [0x003f8]在D: Projects Qleeg Qleeg Qleeg Qleeg views loginpage.xaml.cs:70 ---堆栈跟踪的结尾从以前的位置抛出了例外----在(包装器动态方法( System.Object.30(INTPTR,INTPTR((包装器本地到管理( System.Object.30(INTPTR,INTPTR(

我在做什么错?

更新2

这是应用程序的构造函数

public App()
    {
        InitializeComponent();
        AppDomain.CurrentDomain.UnhandledException += (sender, args) => OnError(sender, args.ExceptionObject as Exception);
        TaskScheduler.UnobservedTaskException += (sender, args) => OnError(sender, args.Exception);
        MainPage = new NavigationPage(new MainPage());
   ......
}

这是我的导航代码

从主页到登录页

async public static Task BaseAppearing(this ContentPage Input)
{
    if (App.Current.UserID == null)
    {
        var page = new LoginPage();
        await Input.Navigation.PushAsync(page);
    }
    else
    {
        App.Current.stopWatch.Restart();
    }
}

和背面

lblMessage.Text = "Welcome!";
lblMessage.TextColor = Color.Green;
Functions.WriteLog("Login", "pre nav pop");
//await App.PopNavigation();// App.Current.MainPage.Navigation.PopAsync();
await Navigation.PopAsync();//THIS IS LINE 70

更新3

我将主页代码切换到此:

    async private void MainPage_Appearing(object sender, EventArgs e)
    {
        if (App.Current.UserID == null) {await App.Current.MainPage.Navigation.PushAsync(new NavigationPage(new LoginPage ())); }
    }

现在,错误消失了(尽管我对原因感到困惑(,但是Navigaion.PopAsync()根本没有做任何事情。没有错误,但也没有导航。

另外,登录页现在出现在顶部有2行/标题。

add add

Task.Delay(300)

在导航页面之前。

我知道这是一个黑客但是,如果您想在出现时导航到其他页面,那么我们必须这样做。因为整页尚未初始化。因此,我们必须等待几秒钟才能在导航堆栈中正确初始化页面

如果在Android上推OnAppearing中的页面,则不会是适当初始化并随后拨打PopAsync或简单地按工具栏中的后退按钮会导致此错误。要绕过,您必须引入一个延迟,以便可以首先正确初始化主页。

protected override void OnAppearing()
{ 
    base.OnAppearing();
    Task.Factory.StartNew(() => Thread.Sleep(500)).ContinueWith(async (t) =>
    {
        await Navigation.PushAsync(new MyNewPage(), false);
    }, TaskScheduler.FromCurrentSynchronizationContext());
}

将导航页添加到您的根页上:

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

简单地推出页面:

async void OnNextPageButtonClicked (object sender, EventArgs e)
{
  await Navigation.PushAsync (new Page2Xaml ());
}

弹出页面:

async void OnPreviousPageButtonClicked (object sender, EventArgs e)
{
  await Navigation.PopAsync ();
}

弹出到根页:

async void OnRootPageButtonClicked (object sender, EventArgs e)
{
  await Navigation.PopToRootAsync ();
}

使用我上面列出的代码在xamarin.forms中推出和弹出页面。我不明白您的项目中的await App.Navigate(page);是什么。

我试图更改代码以使用如下,但确实如此 没有帮助(我也有2个标题栏,顶部(

您在项目中只需要一个导航页面的实例。不要推到这样的新导航页面:

await Current.MainPage.Navigation.PushAsync( new NavigationPage( Page));

只需推到您想要的页面:

 await Current.MainPage.Navigation.PushAsync(Page);

相关内容

  • 没有找到相关文章

最新更新