2009-05-25 69 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包時我反應。

存儲用戶的數據,更改視圖,並要求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

您可能在競賽條件方面走上正軌。

建議:

把一個嘗試{...}趕上(E:錯誤){痕跡( 「錯誤」); }圍繞handleListBoardsEvent()方法中的代碼。

然後,在trace()上放一個斷點,當它碰到時,仔細查看涉及的各種對象。

我的猜測是,你正試圖在創建之前訪問boardList對象 - 即它是空的。

另一種可能性是boardList.dataProvider是一個setter,並且setter中有代碼存在barfing。 (雖然,如果是這種情況,我相信你會注意到FlexBuilder中的堆棧跟蹤)