簡體   English   中英

PopAsync 導致 ArgumentOutOfRangeException

[英]PopAsync causes ArgumentOutOfRangeException

我對Xamarin.FormsXamarin.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 個項目。 MainPage 和 LoginPage,我認為是正確的

所有導航都發生在同一個堆棧上,因為我在應用程序中只有 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/mono/ external/corefx/src/Common/src/CoreLib/System/Collections/Generic/List.cs:180 在 Xamarin.Forms.Platform.Android.AppCompat.NavigationPageRenderer.GetFragment(Xamarin.Forms.Page 頁面,System.Boolean 已刪除, 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 at 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\\Xamarin.Forms.Core\\NavigationPage.cs:297 -- - 從上一個拋出異常的位置開始的堆棧跟蹤結束 --- 在 Xamarin.Forms.NavigationPage+d__68.MoveNext () [0x0004c] 在 D:\\a\\1\\s\\Xamarin.Forms.Core\\NavigationPage.cs: 280 --- 從上一個拋出異常的位置開始的堆棧跟蹤結束 --- 在 Xamarin.Forms.NavigationPage+d__45.MoveNext () [0x000cb] in D:\\a\\1\\s\\Xamarin.Forms.Core\\NavigationPage .cs:168 --- 上一個堆棧跟蹤結束拋出異常的位置 --- 在 Qleeg.LoginPage+d__2.MoveNext () [0x003f8] 在 D:\\Projects\\Qleeg\\Qleeg\\Qleeg\\Views\\LoginPage.xaml.cs:70 --- 堆棧跟蹤結束從上一個拋出異常的位置 --- at (wrapper dynamic-method) System.Object.30(intptr,intptr) at (wrapper native-to-managed) 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());
   ......
}

這是我的導航代碼

從 MainPage 到 LoginPage

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

我將我的 MainPage 代碼切換為:

    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()根本不執行任何操作。 沒有錯誤,但也沒有導航。

此外,LoginPage 現在出現在頂部的 2 個標題行/標題。

添加

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

要將 NavigationPage 添加到您的根頁面:

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); 在你的項目中。

我嘗試更改我的代碼以使用 NavigationPage 如下,但沒有幫助(我在頂部也有 2 個標題欄)

您的項目中只需要一個 NavigationPage 實例。 不要像這樣推送到新的 NavigationPage:

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

只需推送到您想要的頁面:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM