Xamarin:Forms:弹出模式页面后出现 NullReferenceException(无 MVVM)

Xamarin:Forms: NullReferenceException after popping modal page (No MVVM)

提问人:Jason Rapp 提问时间:11/13/2020 更新时间:11/13/2020 访问量:362

问:

我有一个带有 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()

C# Android Xamarin.Forms NullReferenceException

评论


答:

0赞 Jason Rapp 11/13/2020 #1

我又单步执行了几次加载,并注意到在关闭模态后,事件处理程序正在触发。SelectionChanged

注释掉这两行允许页面在不选择任何项的情况下重新加载,并且没有 NullReferenceException。AdventuresCollectionView.SelectedItem = null;