【发布时间】:2009-05-25 14:06:50
【问题描述】:
过去几个小时我一直在努力解决这个问题,但仍然不知道出了什么问题。这是场景:
基于 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 数据包时做出反应。
存储用户数据,更改视图并要求 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 没问题,并且创建了包含所有子组件的自定义面板。感谢阅读!
【问题讨论】:
标签: apache-flex datagrid binary sockets