Flex:PopUpManager给出" ... null对象引用"错误

时间:2012-07-08 18:18:59

标签: 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\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]
...

我看到其他人遇到同样的问题,例如:

http://forums.adobe.com/thread/1031531

http://forums.adobe.com/message/2767130

http://forums.adobe.com/message/3448443

http://forums.adobe.com/thread/655749?tstart=-1

http://forums.adobe.com/thread/801149

http://flex4examples.wordpress.com/2011/05/05/skinnabletextbase-focusmanager-runtime-error-popup/

http://bugs.adobe.com/jira/browse/SDK-32036?page=com.atlassian.jira.plugin.system.issuetabpanels%3Aall-tabpanel

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

import mx.managers.PopUpManager; PopUpManager;

在我的主应用程序中它应该可以工作,但它对我不起作用。

我的应用程序将每个视图状态放在不同的文件中,每个文件都使用<views:View>定义。此外,所有弹出窗口都是定义为<s:TitleWindow>的单独文件。每个文件都包含以下行:

import mx.managers.PopUpManager;

我想知道这是否意味着每个文件都使用不同的弹出管理器(?),当它是一个单例时,只有一个应该用于整个应用程序(如何设置它?)。

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

var _popupName:MyTitleWindowFileName = MyTitleWindowFileName(
    PopUpManager.createPopUp(this, MyTitleWindowFileName, true));   
_popupName.addEventListener(MyAppController.CLOSE_POPUP,onClosePopUp); 
PopUpManager.centerPopUp(_popupName); // call popup 

请注意,当主应用程序(定义为<s:Application>)运行时,ViewStack状态尚未加载(因为它们在第一次使用时会被加载)。不确定这是否有任何原因/结果。

我试图在“将数据传入和传出Spark弹出窗口”部分中遵循Adobe的示例代码:

http://help.adobe.com/en_US/flex/using/WS6c678f7b363d5da52e8f1ca1124a0430dcf-8000.html#WS6c678f7b363d5da52e8f1ca1124a0430dcf-7ffe

任何想法都非常感激。

2 个答案:

答案 0 :(得分:1)

根据您的评论,似乎发生错误,因为焦点仍然在弹出窗口中。我希望PopUpManagerFocusManager类可以更好地处理这个问题。

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

这里有一些你可以做的事情来解决问题(或更好)进一步调试它以了解发生了什么:

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

  • 使用FocusManager.getFocus()进行调试,看看焦点处于不同阶段的位置(打开弹出窗口之前,更改状态之前/之后,关闭弹出之前/之后)。

    < / LI>

答案 1 :(得分:0)

看来这就是我遇到的情况:

Adobe Air: scroller throws error when changes focus between different applications

这是一个Adobe错误。 Solution from Adobe是:

This bug is easily fixed by changing Scroller to do a null pointer check on focusManager before using it.

这是上面第一个链接尝试做的事情。

另一个链接:http://forums.adobe.com/message/3812805