spark Application中Module弹出窗口报错

      最近一直在看flex4.5,adobe官方说spark组件效率很高,从flex3迁移到flex4是“无痛”的。不过用alert的时候就遇到一个麻烦。

     问题的现象大概如下:

     在Application中使用Alert是没有任何问题,但是在Module中使用Alert就出现以下错误,详见下图,调试发现awm为null。

     说明一点在sdk3中是不会存在该问题的。

     spark Application中Module弹出窗口报错

 

 

在网上查了下,有人说这是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] -->