Xamarin"尝试在空对象引用上调用虚方法'void android.view.View.unFocus(android.view.View)'"

Kal*_*ion 7 c# android xamarin.forms

我正在开发一个使用Xamarin.Forms进行跨平台使用的应用程序.最近我在Mac上更新了Xamarin Studio并更新了NuGet包.

我现在收到此错误:尝试在空对象引用上调用虚拟方法'void android.view.View.unFocus(android.view.View)'.(见下面的堆栈跟踪)

当导航远离(或重新渲染)除根视图之外的任何页面时,会发生这种情况.我不相信我已经改变了导航或页面渲染的任何部分.

我很抱歉,如果这有些模糊,从堆栈跟踪看来,这不是从我的代码开始(以任何可追踪的方式).我不知道从哪里开始调试.任何建议都会非常有帮助!

堆栈跟踪

--- 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)
Run Code Online (Sandbox Code Playgroud)

编辑:这只发生在Android上.

编辑:附加信息:这主要发生在调用Navigation.PushAsync或Navigation.PopAsync(包括按下用户后退按钮)时.

以下是我的应用程序中最简单的示例:从主屏幕开始,用户可以采取措施导致QR码扫描页面.此QR码包含有关此驱动程序将提供的负载的信息.扫描完成后,我保存信息并从导航中弹出扫描页面,然后自动将它们推送到加载屏幕.加载数据后,我将它们推送到所需信息列表.(所以现在导航堆栈有[main,loading_screen,list_view])如果此时调用任何Navigation.PopAsync(或PushAsync),那么应用程序崩溃.

Kal*_*ion 2

找到解决方案。简单的答案是我错误地操作了导航堆栈。根据 VincentH_NET 的回答,我应该能够做我最初尝试做的事情,但由于 Xamarin 中的错误我不能。情况如下:

该应用程序仅从导航堆栈上的主页开始,我将其表示为M

[ M

在用户交互时,我将首先将加载屏幕(用 表示)推L送到导航堆栈上,同时准备条形码扫描页面。

[ M, L

扫描页面准备好后,我会自动将用户向前推动,留下导航堆栈,如下所示:

[ M, L, S

现在,用户将扫描包含查找信息的二维码。他们成功扫描代码后,我将它们弹回加载屏幕(现在,当我向服务器请求其数据时,该屏幕被重新用作加载屏幕)

[ M, L

从二维码加载相应信息后,我将它们推送到数据页面的列表视图D

[ M, L, D

此时,我尝试L从导航堆栈中删除加载页面Navigation.RemovePage();,因为不再需要加载页面,并且如果用户按下后退按钮看到未加载任何内容的加载屏幕,则会感到困惑。我想要的是一个如下所示的导航堆栈:

[ M, D

但相反,我的页面删除似乎损坏了导航堆栈,导致了我遇到的错误。

我现在的解决方案是,不要尝试从堆栈中删除加载页面,而是将加载页面设置为在实际未加载任何内容时自动从堆栈中弹出。

PS,如果有人对这个问题有更深入的了解,或者对这些类型的 UI 情况有更好的最佳实践,我很想听听您的答案。