2009-05-25 12 views
0

私はここ数時間、この問題に苦労していますが、何が間違っているのかはまだ分かりません。このシナリオは次のとおりです。PopUpWindowとヌルオブジェクトリファレンス

メイトフレームワークの上に構築されたアプリケーションは、プレーンバイナリソケットを介してリモートサーバとデータを交換する必要があることがあります。

特定のパケットが受信されると、(ViewStackを使用して)表示を切り替えて(PopUpManagerクラスを使用して)カスタムパネルを作成する必要があります。このカスタムパネルには、dataGridコンポーネントが含まれています。このコンポーネントには、前述のパケットと共に受信したXMLがいくつか取り込まれていなければなりません。

DataGridのdataProviderにXMLを割り当てようとすると、「nullオブジェクト参照のプロパティまたはメソッドにアクセスできません」というエラーが常に発生します。私が考えることができるのは、イベントを処理してコンポーネントを作成するときの何らかの競争だけです。 LOGIN_OKパケットを受信したとき、私は反応する上記のコードで

<!-- 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"/> 

:ここ

は、コードの最も興味深い部分です。

ストアのユーザーのデータ、ビューを変更し、要求を送信するためにSocketクラスラッパーを尋ねる(その要求のためのREPONSEは、私たちの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はOKで、すべての子コンポーネントを含むカスタムパネルが作成されているので、実際にはそれを取得できません。読んでくれてありがとう!

答えて

0

あなたは競争条件に関して正しい道にいる可能性が高いです。

提案:

は試して{...}キャッチ入れ(E:エラー){トレース( "エラー"); } handleListBoardsEvent()メソッド内のコードをブロックします。

次に、trace()にブレークポイントを設定し、ヒットすると、関連するさまざまなオブジェクトを見て周りを見てください。

私が推測することは、作成前にboardListオブジェクトにアクセスしようとしていることです。つまり、nullです。

もう1つの可能性は、boardList.dataProviderがセッターであり、バーコードのセッターにコードがあることです。 (もしそうなら、スタックトレースinFlexBuilderに気付いたでしょう)

関連する問題