我正在开发一个使用Xamarin.Forms进行跨平台使用的应用程序。最近我在Mac上更新了Xamarin Studio并更新了NuGet包。
我现在收到这个错误:尝试调用虚方法' void android.view.View.unFocus(android.view.View)'在null对象引用上。 (参见下面的堆栈跟踪)
当导航远离(或重新渲染)除根视图之外的任何页面时,会发生这种情况。我不相信我已经改变了导航或页面渲染的任何部分。
对不起,如果这有点模糊,从堆栈跟踪看来,这不是从我的代码开始(以任何可追踪的方式)。我不知道从哪里开始调试。任何建议都会非常有用!
堆栈跟踪
--- End of managed Java.Lang.NullPointerException stack trace ---
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.unFocus(android.view.View)' on a null object reference
at android.view.ViewGroup.removeViewInternal(ViewGroup.java:4937)
at android.view.ViewGroup.removeViewAt(ViewGroup.java:4899)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1540)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1595)
at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:757)
at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2355)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2146)
at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2098)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2008)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:710)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7224)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
编辑:这只发生在Android上。
编辑:其他信息: 这主要发生在调用Navigation.PushAsync或Navigation.PopAsync(包括按下用户后退按钮)时。
以下是我的应用中发生这种情况的最简单示例: 从主屏幕开始,用户可以采取行动以导致QR码扫描页面。此QR码包含有关此驱动程序将提供的负载的信息。扫描完成后,我保存信息并从导航中弹出扫描页面,然后自动将它们推送到加载屏幕。加载数据后,我将它们推送到所需信息列表。 (所以现在导航堆栈有[main,loading_screen,list_view])如果此时调用了任何Navigation.PopAsync(或PushAsync),那么应用程序崩溃了。
答案 0 :(得分:4)
这是Xamarin Forms 2.3.3.193中确认的错误:
Bug 53179 - PopAsync crashing after RemovePage when support packages are updated to 25.1.1
所以你所做的并不是错误的;但是你的答案是一个有效的解决方法。
答案 1 :(得分:2)
找到解决方案。 简单的答案是我错误地操纵了导航堆栈。根据VincentH_NET的回答,我应该可以做我最初尝试做的事情,但是由于Xamarin中的一个错误我不能。情况如下:
应用程序仅从导航堆栈上的主页面开始,我将用M
表示
[ M
在用户互动时,我会首先将一个加载屏幕(由L
表示)推到导航堆栈上,同时我准备一个条形码扫描页面。
[ M, L
扫描页面准备就绪后,我会自动向前推送用户,离开导航堆栈如下:
[ M, L, S
现在用户将扫描包含查找信息的QR码。在他们成功扫描代码之后,我将它们弹回到加载屏幕(现在我将其重新用作加载屏幕,同时向服务器请求其数据)
[ M, L
从QR代码加载相应的信息后,我将它们推送到数据的列表视图,页面D
。
[ M, L, D
此时我尝试使用L
从导航堆栈中删除加载页面Navigation.RemovePage();
,因为不再需要加载页面,如果用户按下后退按钮查看加载没有加载的屏幕。我想要的是一个看起来像这样的导航堆栈:
[ M, D
但相反,似乎我的页面删除损坏了导航堆栈,导致我遇到的错误。
我现在的解决方案是,而不是尝试从堆栈中删除加载页面,以设置加载页面,如果实际上没有加载任何内容,则自动将其自身弹出堆栈。
P.S。如果有人对这个类型的UI情况有更深入的了解这个问题或更好的最佳实践,我很乐意听到你的答案。