Apache flex Flex:PopUpManager giving“;。。。空对象引用“;错误

Apache flex Flex:PopUpManager giving“;。。。空对象引用“;错误,apache-flex,Apache Flex,我有一个主应用程序调用几个ViewStack状态,每个状态都有弹出窗口。如果我没有打开任何弹出窗口,我可以在状态之间移动。如果我打开一个弹出窗口,然后尝试使用currentState=…更改状态,我会得到错误: TypeError: Error #1009: Cannot access a property or method of a null object reference. at spark.components::Scroller/focusInHandler()[E:\dev\4.y

我有一个主应用程序调用几个ViewStack状态,每个状态都有弹出窗口。如果我没有打开任何弹出窗口,我可以在状态之间移动。如果我打开一个弹出窗口,然后尝试使用
currentState=…
更改状态,我会得到错误:

TypeError: Error #1009: Cannot access a property or method of a null object reference.
at spark.components::Scroller/focusInHandler()[E:\dev\4.y\frameworks\projects\spark\src\spark\components\Scroller.as:2139]
at flash.display::Stage/set focus()
at mx.core::UIComponent/setFocus() [E:\dev\4.y\frameworks\projects\framework\src\mx\core\UIComponent.as:9905]
...
我看到其他人也有同样的问题,例如:

但我还没有弄明白如何实施推荐的解决方案。听起来我应该包括:

import mx.managers.PopUpManager; PopUpManager;
在我的主应用程序中,它应该可以工作,但它不适合我

我的应用程序的每个视图状态都位于不同的文件中,每个视图状态都是使用
定义的。此外,所有弹出窗口都是定义为
的独立文件。每个文件包括以下行:

import mx.managers.PopUpManager;
我想知道这是否意味着每个文件都在使用不同的弹出式管理器(?),当它是一个单例并且整个应用程序只应使用一个时(如何设置?)

我用来调用弹出窗口的代码是:

var _popupName:MyTitleWindowFileName = MyTitleWindowFileName(
    PopUpManager.createPopUp(this, MyTitleWindowFileName, true));   
_popupName.addEventListener(MyAppController.CLOSE_POPUP,onClosePopUp); 
PopUpManager.centerPopUp(_popupName); // call popup 
请注意,当主应用程序(定义为
)运行时,ViewStack状态尚未加载(因为它们在第一次使用时已加载)。不确定这是否有任何因果关系

我在“向Spark弹出窗口传递数据和从Spark弹出窗口传递数据”一节中尝试了遵循Adobe的示例代码:


非常感谢任何想法。

根据您的评论,似乎出现错误是因为焦点仍在弹出窗口中。我希望
PopUpManager
FocusManager
类能够更好地处理这个问题

我能想到的一件事是FocusManager可能正在尝试处理这个问题。但是,由于状态更改,当视图状态更改时,最初具有焦点的项(在打开弹出窗口之前的视图堆栈子项中)可能不再存在。只是预感,看看你的代码

以下是您可以做的一些事情,以解决问题(或者更好地)进一步调试它以了解发生了什么:

  • 在关闭弹出窗口之前,使用
    FocusManager.setFocus()
    将焦点移回视图堆栈子对象中的对象

  • 使用
    FocusManager.getFocus()
    调试并查看它认为焦点在不同阶段的位置(打开弹出窗口之前、更改状态之前/之后以及关闭弹出窗口之前/之后)


看来这就是我所经历的情况:

这是一个Adobe bug。是:

在使用focusManager之前,通过更改Scroller在focusManager上执行空指针检查,可以轻松修复此错误。

这就是上面第一个链接试图做的


另一个链接:

您的错误与论坛帖子中的其他错误不同。此外,关于在主应用程序中放置引用
PopUpManager
的注释仅适用于使用Flex模块的情况。在这种情况下,当您更改状态时,滚动条正在接收焦点,并导致错误。问题:发生这种情况时,您正在更改哪个视图(主应用程序、视图堆栈子视图或弹出窗口)中的状态?我正在更改视图堆栈子视图中的状态。如果我打开一个弹出窗口,然后更改状态,并删除弹出窗口,则会发生错误。但是,如果我打开一个弹出窗口,然后选择一些使焦点远离弹出窗口的内容,例如手动单击“视图堆栈”子视图中的spark DropDownList或TextInput,然后更改状态并删除弹出窗口,则不会发生错误。@ggkmath-您能够解决此问题吗?这与我所处的情景完全相同。打开一个弹出窗口,更改状态,然后更改错误。@ggkmath-我能够使用此处的解决方案解决此问题,感谢Sunil,我今天上午一直在尝试使用setFocus()。其思想是以编程方式“单击”视图堆栈子级中的某个功能,就像用户手动单击它一样。在离开视图堆栈之前,如果执行
myTextInputId.setFocus()然后错误消失。但是,执行
focusManager.setFocus(myButtonId)不起作用。执行
myLabelId.setFocus()也不起作用。由于并非所有视图堆栈孩子都有TextInput组件,因此不确定这是否是一个可接受的解决方案。我很想知道发生了什么。注意,你的应用程序中可能有多个FocusManager。每个人都管理自己的“标签循环”。例如,一个弹出窗口有自己的FocusManager b/c,当用户按下“tab”键时,它只会在弹出窗口中移动焦点。当您执行
focusManager.setFocus(myButtonId)
时,这是子视图或弹出窗口中的
focusManager
?我唯一一次使用focusManager是在这一行代码中。由于它位于视图堆栈子视图(而不是弹出窗口)中,我猜它是视图堆栈子视图的FocusManager。嗯,您可能想发布代码或一个简单的示例。听起来您需要在调试器中逐步检查代码,以了解其失败的原因。