过去几个小时我一直在努力解决这个问题,但仍然不知道出了什么问题。这是场景:
构建在Mate框架之上的应用程序有时需要通过普通的二进制套接字与远程服务器交换数据。
当收到特定数据包时,我必须切换视图(使用ViewStack)并创建自定义面板(使用PopUpManager类)。此自定义面板包含一个dataGrid组件,该组件必须填充一些XML以及提到的数据包。
麻烦的是,当我尝试将XML分配给DataGrid的dataProvider时,我经常会遇到“无法访问null对象引用的属性或方法”错误。我唯一能想到的是处理事件和创建组件时的某种竞争。
以下是最有趣的代码:
<!-- 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没问题,并且创建了包含所有子组件的自定义面板。谢谢你的阅读!
答案 0 :(得分:0)
你可能在竞争条件方面走上正轨。
建议:
尝试{...} catch(e:错误){trace(“error”);阻止handleListBoardsEvent()方法中的代码。
然后,在trace()上放置一个断点,当它点击时,仔细查看所涉及的各种对象。
我的猜测是你在创建boardList对象之前试图访问它 - 即它是null。
另一种可能性是boardList.dataProvider是一个setter,并且setter中的代码是barfing。 (虽然如果是这样的话,我相信你会注意到在FlashBuilder中的堆栈跟踪)