提问人:Jason Rapp 提问时间:11/13/2020 更新时间:11/13/2020 访问量:362
Xamarin:Forms:弹出模式页面后出现 NullReferenceException(无 MVVM)
Xamarin:Forms: NullReferenceException after popping modal page (No MVVM)
问:
我有一个带有 TabbedPage 布局的项目。其中一个 TabbedPages 具有一个 ItemsSource,其中包含一个推送模式页的 ItemSelected 事件处理程序。当我弹出模式页面时,我收到一个 System.NullReferenceException:“对象引用未设置为对象的实例。我目前没有使用 MVVM,并且我已经在我能想到的页面上的所有内容上设置了块,但我找不到异常在哪里,但 Visual Studio 似乎表明异常不在我的代码中。调用堆栈:try/catch
0xFFFFFFFFFFFFFFFF in System.Diagnostics.Debugger.Mono_UnhandledException_internal
0x1 in System.Diagnostics.Debugger.Mono_UnhandledException at /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/mcs/class/corlib/System.Diagnostics/Debugger.cs:125,4
0x20 in Android.Runtime.DynamicMethodNameCounter.1
0x12 in System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw at /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:157,13
0x6 in System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c.<ThrowAsync>b__7_0 at /Users/builder/jenkins/workspace/archive-mono/2020-02/android/release/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/AsyncMethodBuilder.cs:1021,49
0xC in Android.App.SyncContext.
0xE in Java.Lang.Thread.RunnableImplementor.Run
0x8 in Java.Lang.IRunnableInvoker.n_Run
0x11 in Android.Runtime.DynamicMethodNameCounter.1
导致 NRE 的页面:
{
private ObservableCollection<Adventures> adventures;
private List<Character> charactersList;
string played = "No";
string gmed = "No";
public AdventuresPage()
{
InitializeComponent();
}
protected async override void OnAppearing()
{
try
{
var adventureList = await App.client.GetTable<Adventures>().Take(200).ToListAsync();
adventures = new ObservableCollection<Adventures>(adventureList);
AdventuresCollectionView.ItemsSource = adventures;
AdventuresCollectionView.SelectedItem = null;
}
catch (NullReferenceException ex)
{
Console.WriteLine(ex.Message);
}
base.OnAppearing();
}
private async void AdventuresCollectionView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
var adventure = AdventuresCollectionView.SelectedItem as Adventures;
string advName = (from a in adventures
where a.Id == adventure.Id
select a.AdventureName).First();
await DetermineCredit(advName);
if(adventure != null)
{
await Navigation.PushModalAsync(new AdventureDetailsPage(adventure, played, gmed));
}
else
{
AdventuresCollectionView.SelectedItem = null;
}
}
private void AdvSearchBar_TextChanged(object sender, TextChangedEventArgs e)
{
var normalizedQuery = e.NewTextValue.ToString().ToLower() ?? "";
AdventuresCollectionView.ItemsSource = adventures.Where(a => a.AdventureName.ToLowerInvariant().Contains(normalizedQuery)).ToList();
}
private async Task DetermineCredit(string name)
{
string advName = name;
charactersList = new List<Character>(await App.client.GetTable<Character>().Where(a => a.AccountId == App.account.Id).ToListAsync());
try
{
for (int c = 0; c < charactersList.Count(); c++)
{
var chara = await App.client.GetTable<Character>().Where(ch => ch.Id == charactersList[c].Id).ToListAsync();
string charId = (from ch in chara
select ch.Id).First().ToString();
var charAdv = await App.client.GetTable<CharAdventures>().Where(ca => ca.AdventureName == advName && ca.CharacterId == charId).ToListAsync();
string creditType = (from ch in charAdv
where advName == ch.AdventureName
select ch.CreditType).FirstOrDefault();
if (string.IsNullOrEmpty(creditType))
{
break;
}
else if (creditType == "Player" && played == "No")
{
played = "Yes";
}
else if (creditType == "GM" && gmed == "No")
{
gmed = "Yes";
}
else
{
break;
}
}
}
catch (NullReferenceException ex)
{
Console.WriteLine(ex.Message);
}
}
}
堆栈跟踪没有为我提供足够的信息来找出导致错误的原因,并且在我单步执行时直到重写的方法完成后才出现。我在搜索中没有看到任何与此类似的内容,我不明白为什么第一次加载页面时不会出现,而仅在弹出模式页面时才会出现。任何建议将不胜感激。OnAppearing()
答:
0赞
Jason Rapp
11/13/2020
#1
我又单步执行了几次加载,并注意到在关闭模态后,事件处理程序正在触发。SelectionChanged
注释掉这两行允许页面在不选择任何项的情况下重新加载,并且没有 NullReferenceException。AdventuresCollectionView.SelectedItem = null;
评论