views:

260

answers:

1

Hello,

I've been struggling with this problem for last few hours but still got no idea what's wrong. Here's the scenario:

Application built on top of the Mate framework sometimes need to exchange data with remote server over plain binary socket.

When specific packet is received I have to switch view (using ViewStack) and create custom panel (using PopUpManager class). This custom panel contains a dataGrid component which has to be populated with some XML received along with mentioned packet.

Trouble is that when I try to assign XML to DataGrid's dataProvider I constantly get "Cannot access a property or method of a null object reference" error. The only thing I can think of is some kind of race when processing events and creating components.

Here are the most interesting pieces of code:

<!-- LoginEvent.LOGIN_OK _____________________________________________________________________ -->

<EventHandlers type="{LoginEvent.LOGIN_OK}">

 <MethodInvoker generator="{UserManager}" method="storeCurrentUser" arguments="{event.fullName}"/>
 <EventAnnouncer generator="{NavigationEvent}" type="{NavigationEvent.MAIN}"/>
 <MethodInvoker generator="{CustomSocket}" method="listBoards"/>

In the above code I react when the LOGIN_OK packet is received.

Store user's data, change the view and ask the Socket class wrapper to send request (the reponse for that request is our verySpecificPacket)

Here's detailed info about how I change the view and create custom pop up. In MainUI.mxml:

<mate:Listener type="{NavigationEvent.MAIN}"    method="handleNavigationEvent" />

private function launchBoardListWindow():void {
   Logger.info("launchBoardListWindow()");
   var win:BoardList = PopUpManager.createPopUp(this, BoardList, true) as BoardList;
   PopUpManager.centerPopUp(win);
}

private function handleNavigationEvent(event:NavigationEvent):void {

   viewStack.selectedIndex = MAIN;
   launchBoardListWindow();
}

The third position in EventMap isn't important, it just ask socket wrapper to send some kind of packet. The server is supposed to respond with verySpecialPacket along with XML payload. And here we are at the part where the error is. In mxml describing my custom panel I set up a listener for an event which is being dispatched after my verySpecialPacket is received.

public function handleListBoardsEvent(e:ListBoardsEvent):void {

   Logger.info("handleListBoardsEvent");     
   xmlData = e.xml;  
   boardList.dataProvider = xmlData.children(); // Here's the error!!!
}

I really don't get it, since the xmlData is OK, and custom panel with all child components were created. Thanks for reading!

A: 

You're likely on the right track in respect of a race condition.

Suggestion:

Put a try { ... } catch (e:Error) { trace("error"); } block around the code in your handleListBoardsEvent() method.

Then, put a breakpoint on the trace() and, when it hits, take a good look around at the various objects involved.

My guess is that you're attempting to access the boardList object before it is created - i.e. it's null.

The other possibility is that boardList.dataProvider is a setter and there's code in the setter that's barfing. (Although, if that were the case, I'm sure you would have noticed the stacktrace inFlexBuilder)

verveguy