2009-05-25 4 views
0

Я борется с этой проблемой за последние несколько часов, но до сих пор не знаю, что случилось. Вот сценарий:PopUpWindow и ссылка на нулевой объект

Приложение, построенное поверх структуры Mate, иногда необходимо обменивать данными с удаленным сервером поверх обычного двоичного сокета.

При получении определенного пакета мне нужно переключить представление (используя ViewStack) и создать пользовательскую панель (используя класс PopUpManager). Эта настраиваемая панель содержит компонент dataGrid, который должен быть заполнен некоторым XML, полученным вместе с указанным пакетом.

Проблема в том, что когда я пытаюсь назначить XML DataGrid dataProvider, я постоянно получаю сообщение об ошибке «Не удается получить доступ к свойствам или методу нулевой ссылки на объект». Единственное, о чем я могу думать, это какая-то гонка при обработке событий и создании компонентов.

Вот наиболее интересные фрагменты кода:

<!-- 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"/> 

В приведенном выше коде я реагирую, когда пакет LOGIN_OK принимается. Данные

Маркета пользователя, изменить вид и задать класс Оправа обертку для отправки заявки (réponse для этого запроса наш verySpecificPacket)

Вот подробная информация о том, как изменить вид и создавать собственные всплывающие , В 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(); 
} 

Третья позиция в EventMap не важно, это просто попросить сокет обертку, чтобы отправить какой-то пакет. Предполагается, что сервер должен ответить verySpecialPacket вместе с полезной нагрузкой XML. И здесь мы находимся в той части, где ошибка. В mxml, описывающем мою настраиваемую панель, я настроил прослушиватель для события, которое отправляется после моего verySpecialPacket.

public function handleListBoardsEvent(e:ListBoardsEvent):void { 

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

Я действительно не понимаю, так как XMLDATA ОК, и были созданы пользовательские панели со всеми нижестоящими компонентами. Спасибо за прочтение!

ответ

0

Вы, вероятно, на правильном пути в отношении состояния гонки.

Предложение:

Помещенный попробовать {...} поймать (е: Error) {след ("ошибка"); } блокировать код в методе handleListBoardsEvent().

Затем поместите точку останова на trace() и, когда она ударит, хорошо осмотритесь вокруг различных объектов.

Я предполагаю, что вы пытаетесь получить доступ к объекту boardList до его создания, то есть он равен нулю.

Другая возможность заключается в том, что boardList.dataProvider - это сеттер, и в настройщике есть штрих. (Хотя, если это так, я уверен, что вы заметили бы stacktrace inFlexBuilder)

Смежные вопросы