PopUpButtonのエラー

こないだのエントリでちょっと触れましたが、PopUpButtonのポップアップClose中にPopUpButtonをremoveChild()するとエラーになる話。
動きを追ってみると、Tweenエフェクトが終わる前にpopupのインスタンスをnullにしてしまっているのが問題みたい。
removedFromStageイベントのハンドラです。
BugBaseにも上がってました。

厄介なのが、このTweenエフェクトの部分が一部mx_internal名前空間に隠れていて、手出しができないということ。
それなりに対策を考えてみましたが…。

  1. closeDurationを0に設定し、close()のエフェクトを事実上無効にする。
  2. popUpプロパティのインスタンスは一度ボタンをremoveするとnullになってしまうので、参照を他に残しておく。

itemRendererの内部にPopUpを持たせる場合、ふとした弾みでpopupが画面から消えないことがあり、これが野良コンポーネントになりやすい。

自分としては一つのpopupインスタンスをすべてのボタンで共有する方法を推奨します。
具体的には、

  1. アイテムレンダラーにはpopupのないButtonあるいはPopUpButtonを置く。
  2. 実際にpopupの親になるPopUpButtonを、visible=false、大きさ最小で用意する。rawChildrenで最前面に置く。
  3. listのitemClickイベントなどを使って押されたボタンを特定し、その位置に見えないボタンを移動する。
  4. 見えないボタンのpopupにポップアップするコンポーネントをセットし、open()で表示する。

アイテムレンダラーは大きなものを作ってしまうと、スクロール時に生成するためタイムロスが発生します。
ポップアップは基本的に一度に一つしか使わないので、押したときだけ作るのがよいかと。