Я боролся с этой проблемой последние несколько часов, но до сих пор не понял, что случилось. Вот сценарий:
Приложение, построенное поверх платформы 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 все в порядке, и была создана настраиваемая панель со всеми дочерними компонентами. Спасибо за чтение!