![](/img/trans.png)
[英]Accesing the first element of an updated listview causes System.ArgumentOutOfRangeException
[英]PopAsync causes ArgumentOutOfRangeException
我對Xamarin.Forms
很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 個項目。 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.