需求背景:
通過樹形菜單加載多個不同的module。
問題現象:module頁面存在拖動,Popup,Alert或者colorpicker出現錯誤信息:
TypeError: Error #1034: 強制轉換類型失敗:無法將 mx.managers::PopUpManagerImpl@7155ac1 轉換為 mx.managers.IPopUpManager。
解決方案:
在Application加入如下代碼引用:
<mx:Script>
<![CDATA[
import mx.managers.DragManager;
import mx.managers.IPopUpManager;
/* Create dummy variables. */
//避免出現:無法將 mx.managers::PopUpManagerImpl@52a09a1 轉換為 mx.managers.IPopUpManager 錯誤
private var dragManager : DragManager;
private var popUpManager : IPopUpManager;
//process....
]]>
</mx:Script>
問題原因分析:
屬于ModuleLoader
shared code problem.
當Module中使用managers時(如PopUpManager,DragManager,
HistoryManager等)則可能出現這個問題(當application里在loader之前沒有引入這些manager的引用時)。
manager的方法是靜態方法,整個應用程序中創建了一個該manager接口的singleton實例,但module僅在自己的Application
domain中使用該單例,
當多個module使用同一個單例manager且main application沒有使用時,就會出現這個空對象引用問題:第一個引入某manager的module不能將該manager接口的singleton跟其他module共享,其他module調用該Manager的方法時,應用程序不會再創建該manager接口的實例,這個module就無法引用到該manager接口的實例,就出現了空對象引用問題.
參考資料:Flex sdk源碼。
目前在Application創建了些Application范圍內沒有使用到的"木偶變量",從代碼可讀性上來說不是很好。有其他比較好的解決方案的同學麻煩請告之下,:)