ggkmath
ggkmath

Reputation: 4246

Flex: PopUpManager giving "...null object reference" error

I have a main application calling several ViewStack states, each with popup windows. If I don't open any popup windows, I can move between states fine. If I open a popup window then try to change the state using currentState=... I get the error:

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]
...

I see others having the same problem, for example here:

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

But I haven't figured out how to implement the recommended solution. It sounds like I should just include:

import mx.managers.PopUpManager; PopUpManager;

inside my main application and it should work, but it doesn't work for me.

My application has each view state in a different file, each defined using <views:View>. Also, all of the popups are separate files defined as <s:TitleWindow>. Each file includes this line:

import mx.managers.PopUpManager;

I wonder if this means each file is using a different popup manager(?), when it's a singleton and only one should be used for the whole app (how to set that up?).

The code I use to call a popup is:

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

Note that when the main application (the one defined as <s:Application>) runs, the ViewStack states have not been loaded yet (since they get loaded when they are used the first time). Not sure if that has any cause/effect here.

I've tried to follow Adobe's example code in the "Passing data to and from a Spark pop-up window" section here:

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

Any ideas much appreciated.

Upvotes: 2

Views: 2347

Answers (2)

ggkmath
ggkmath

Reputation: 4246

It appears this is the situation I'm experiencing:

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

It's an Adobe bug. Solution from Adobe is:

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

which is what the first link above attempts to do.

Another link: http://forums.adobe.com/message/3812805

Upvotes: 0

Sunil D.
Sunil D.

Reputation: 18193

Based on your comments, it seems like the error occurs because the focus remains in the popup. I would expect the PopUpManager and FocusManager classes to handle this better.

One thing I can think of is that the FocusManager may be trying to handle this. But since the state changes, the item that originally had focus (in the view stack child, before the pop up was opened) may no longer be there when the view state changes. Just a hunch, w/out seeing your code.

Here's some things you can do to either work around the problem (or better) further debug it to understand what is happening:

  • Use FocusManager.setFocus() to move the focus back to an object in the view stack child before closing the pop up

  • Use FocusManager.getFocus() to debug and see where it thinks the focus is at various stages (before opening popup, before/after changing state, and before/after closing pop up).

Upvotes: 1

Related Questions