最近一直在看flex4.5,adobe官方说spark组件效率很高,从flex3迁移到flex4是“无痛”的。不过用alert的时候就遇到一个麻烦。
问题的现象大概如下:
在Application中使用Alert是没有任何问题,但是在Module中使用Alert就出现以下错误,详见下图,调试发现awm为null。
说明一点在sdk3中是不会存在该问题的。
在网上查了下,有人说这是flex4的一个很“经典”的问题了,从adobe的论坛上也找到了解决问题的答案。
解决方法很简单,只需要在Application中引用
import mx.managers.PopUpManager;
并且实例化PopUpManager
存在必有它存在的理由,我跟踪了代码,简单的分析了下原因,如有不合理的地方还望指出。
下面是一个老外关于这个问题的回答:
In Flex 4, if you have a shell app and sub-apps or modules, the main app
must link in PopUpManager explicitly.
Import mx.managers.PopUpManager; PopUpManager;
It should be explained in the release notes.
上面的大概意思就是在flex4中,如果存在子应用或者module,那么你必须明确在Application中引用PopUpManager并实例化PopUpManager。这条规则应该在flex发行说说明的,但是adobe这家伙有点懒,什么都没有留下。
spark组件为了提高自己的效率,相比flex3一个变化就是在application中并不是加载很多并初始化manager类,而是需要的时候才加载,而且这些manager是单例的。
下面是flex4 SystemManager的部分代码
c = Singleton.getClass("mx.managers::IActiveWindowManager"); if (c) { registerImplementation("mx.managers::IActiveWindowManager", new c(this)); }
c返回为null,因此就不会实例化IActiveWindowManager类,但是子Module中弹出窗口要用到该类,因此就会报空指针异常了。
<!-- [DocumentBodyEnd:3e095a63-3232-42b2-95eb-f7698016c327] -->