PopUpWindow и нулевая ссылка на объект - PullRequest
0 голосов
/ 25 мая 2009

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

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

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

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

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

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

Сохраните данные пользователя, измените представление и попросите оболочку класса Socket отправить запрос (ответом на этот запрос является наш 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 все в порядке, и была создана настраиваемая панель со всеми дочерними компонентами. Спасибо за чтение!

1 Ответ

0 голосов
/ 26 мая 2009

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

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

Поместите попытку {...} catch (e: Error) {trace ("error"); } блок вокруг кода в вашем методе handleListBoardsEvent ().

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

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

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

...