当我第二次设置它的 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 函数时,计划时间会加倍?