【问题标题】: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,然后要弄清楚为什么

标签: c# xamarin picker pickerview


【解决方案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" 添加到我的选择器标记来解决此问题。现在它可以工作了,后面的代码没有改变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-09
    • 2022-12-29
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多