Flex4 加载模块Alert弹出框背景透明问题

来源:互联网 发布:三菱plc编程实例精解 编辑:程序博客网 时间:2024/06/05 08:16

先看下这篇文章

http://www.riadev.com/flex-thread-541-1-1.html

为什么在模块化应用中要让Application持有对PopUpManager的引用?

基本上做Flex模块化开发的朋友,都会碰到这个问题:如果你的Module处于Application当前域的子域,在Module中尝试使用PopUpManager,Menu,或Alert等被SystemManager顶级类管理的类(基本都是静态类,内部使用单例),那么会得到运行时错误。

如果你尝试去查找解决方案,那大部分人都会告诉你,需要让Application持有对这些管理类的引用,就是在Application中写下面的Hack Code:

  1. PopUpManager;Alert;
复制代码

这样做就可以消除错误,但我们会很好奇,产生这个错误的原因是什么呢?

官方API中对这个情况的解释很简单:对于PopUpManager这样的静态类所依赖的实例,如果先被Module调用,则Module就持有了这个实例,这样如果Application或其它Module尝试使用PopUpManager就会出错。

这里我们的疑问是,ApplicationDomain只是限制类定义的访问(父域不能访问子域的类定义),因为我们已经使用RSL机制,可以确保PopUpManager的相关类定义是被Application持有的,所以即使PopUpManager的实例存在于Module中,Application也是可以获取到的,那为什么PopUpManager还会报错呢?

真正的原因在这里:IFlexModuleFactory

  1. 对于Application,它的父容器是SystemManager,而SystemManager本身实现了IFlexModuleFactory接口,所以对于Application,moduleFactory指向了SystemManager
  2. 对于Module,如果未指定moduleFactory,则会使用自己的IFlexModuleFactory的一个实现类(这个类被编译器生成,比如[DashboardModule_mx_core_FlexModuleFactory]),也就是说,Module持有了自己的IFlexModuleFactory实现

然后就可以解释上面的那个问题,在Module使用PopUpManager时,如果PopUpManager还没有实例化,则基于自己的IFlexModuleFactory实现来实例化PopUpManager,也就是说,Module的IFlexModuleFactory实例持有了PopUpManager的实例;而当使用PopUpManager时,PopUpManager会尝试从SystemManager中获取PopUpManager的实例,注意SystemManager并不持有它的实例,于是返回为空,造成程序出错。

这样来看,API中的解释是正确的,但解释的不够深入,会造成我们的误解。希望本文能对存在此疑问的朋友有所帮助。

看完之后大家自己能解决吗?

只要在你的主应用中加入Alert框的引用就可以了

private var myAlert:Alert;

0 0
原创粉丝点击