当我第二次设置它的 ItemsSource 时,为啥这个选择器会崩溃?

Posted

技术标签:

【中文标题】当我第二次设置它的 ItemsSource 时,为啥这个选择器会崩溃?【英文标题】:Why this picker crashes when I'm setting its ItemsSource at second time?当我第二次设置它的 ItemsSource 时,为什么这个选择器会崩溃? 【发布时间】:2020-01-16 23:39:16 【问题描述】:

我在 App.cs 中存储了一个对象列表,因为我想在用户浏览其他内容页面(使用导航页面)时保留数据。当他回到有选择器的页面时, 我希望上面有相同的项目,但是在再次设置 ItemsSources 时它会使应用程序崩溃。

包含选择器的页面:

public class Local

   public string cidade  get; set; 
   public int id  get; set; 


if (((App)App.Current).Backup.Count<1)

   try
   
      using (WebClient browser = new WebClient())
      
          Uri uriCidades = new Uri("xxxxx.php");
          jsonCidades = await browser.DownloadStringTaskAsync(uriCidades);
      
      var ListaCidades = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Local>>(jsonCidades);
      PickerCidades.ItemsSource = ListaCidades; // it works as expected
      ((App)App.Current).Backup = ListaCidades;  // it works as expected
   
   catch (Exception)
   
      throw;
   

else

    PickerCidades.ItemsSource = ((App)App.Current).Backup; // the app crashs here


这是在 App.cs 中


public class Local

   public string cidade  get; set; 
   public int id  get; set; 

public List<Local> Backup = new List<Local>();

错误输出:

System.NullReferenceException: Object reference not set to an instance of an object.
  at MasterDetailPageNavigation.ContactsPage.CarregaCidades () [0x0016a] in ContactsPage.xaml.cs:56
  at System.Runtime.CompilerServices.AsyncMethodBuilderCore+<>c.<ThrowAsync>b__7_0 (System.Object state) [0x00000] in /Users/builder/jenkins/workspace/archive-mono/2019-08/android/release/mcs/class/referencesource/mscorlib/system/runtime/compilerservices/AsyncMethodBuilder.cs:1021
  at Android.App.SyncContext+<>c__DisplayClass2_0.<Post>b__0 () [0x00000] in <11f101b564894ca7af6c482ddc51c698>:0
  at Java.Lang.Thread+RunnableImplementor.Run () [0x00008] in <11f101b564894ca7af6c482ddc51c698>:0
  at Java.Lang.IRunnableInvoker.n_Run (System.IntPtr jnienv, System.IntPtr native__this) [0x00009] in <11f101b564894ca7af6c482ddc51c698>:0
  at at (wrapper dynamic-method) Android.Runtime.DynamicMethodNameCounter.47(intptr,intptr)

【问题讨论】:

“它崩溃了”是一个无用的描述。导致崩溃的具体异常是什么? @Jason 已使用日志进行编辑,但主要消息是“System.NullReferenceException:对象引用未设置为对象的实例。” 首先要弄清楚哪个元素是null,然后要弄清楚为什么 【参考方案1】:

如果它在您有注释的代码行上抛出 NullReferenceException,那么只有 3 种可能性:PickerCidades 为 null、App 为 null 或 App.Current 为 null。如果您在该行设置断点并在调试器中暂停,您应该能够将鼠标悬停在每个单独的引用上并查看哪个(或多个)为空。

【讨论】:

我可以通过 ((App)App.Current).Backup 中的 foreach 循环获取所有存储的元素所以问题可能出在 PickerCidades 上。我会试试你的建议。 是的,问题在于 PickerCidades,它是空的。如果它存在于xaml,它怎么可能为null? @SandroBenevides 是否在您导航到的当前页面的 xaml 中? @Joe 是的......它在当前页面上! ItemsSource 也被设置在选择器所在的 xaml 页面的后面代码中。 @Joe 通过将 x:FieldModifier="public static" 添加到选取器 xaml 标记来修复【参考方案2】:

我可以通过将 x:FieldModifier="public static" 添加到我的选择器标记来解决此问题。现在它可以工作了,后面的代码没有改变。

【讨论】:

以上是关于当我第二次设置它的 ItemsSource 时,为啥这个选择器会崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

Jquery .animate() 在我第二次触发它时不起作用

当我第二次启动应用程序时标签消失

当我第二次关注 Textview 时,文本在 textView 中向上移动

为啥当我第二次使用完全相同的参数调用 IMMUTABLE 函数时,计划时间会加倍?

RxAlamofire 请求在我第二次调用该函数时没有被触发

为什么当我第二次在Android Studio中使用导航启动动作时,导航目的地丢失了?