PopUpButtonのエラー
こないだのエントリでちょっと触れましたが、PopUpButtonのポップアップClose中にPopUpButtonをremoveChild()するとエラーになる話。
動きを追ってみると、Tweenエフェクトが終わる前にpopupのインスタンスをnullにしてしまっているのが問題みたい。
removedFromStageイベントのハンドラです。
BugBaseにも上がってました。
厄介なのが、このTweenエフェクトの部分が一部mx_internal名前空間に隠れていて、手出しができないということ。
それなりに対策を考えてみましたが…。
- closeDurationを0に設定し、close()のエフェクトを事実上無効にする。
- popUpプロパティのインスタンスは一度ボタンをremoveするとnullになってしまうので、参照を他に残しておく。
itemRendererの内部にPopUpを持たせる場合、ふとした弾みでpopupが画面から消えないことがあり、これが野良コンポーネントになりやすい。
自分としては一つのpopupインスタンスをすべてのボタンで共有する方法を推奨します。
具体的には、
- アイテムレンダラーにはpopupのないButtonあるいはPopUpButtonを置く。
- 実際にpopupの親になるPopUpButtonを、visible=false、大きさ最小で用意する。rawChildrenで最前面に置く。
- listのitemClickイベントなどを使って押されたボタンを特定し、その位置に見えないボタンを移動する。
- 見えないボタンのpopupにポップアップするコンポーネントをセットし、open()で表示する。
アイテムレンダラーは大きなものを作ってしまうと、スクロール時に生成するためタイムロスが発生します。
ポップアップは基本的に一度に一つしか使わないので、押したときだけ作るのがよいかと。