如何在文档 class 中使用访问阶段加载外部 swf?

How to load external swf with access stage in document class?

我有一个加载其他 swf 的主 swf。使用主 swf (sketch) 中的以下代码一切正常:

var loader:Loader = new Loader();
stage.addChild(loader);
loader.load(new URLRequest('external.swf'));

但是,当尝试加载使用 文档 class 的外部 swf 时,它出现了对 stage 对象的访问错误。为了更清楚,将要加载的swf发布中配置了一个文档class:

Main.as 内,有 class 作为舞台的访问代码:

package {
    import flash.display.MovieClip;
    public class Main extends MovieClip {
        public function Main() {
            // access stage
            trace(stage);
            trace(stage.stageWidth);
        }
    }
}

当主swf尝试加载外部swf时,出现错误:

null
TypeError: Error #1009: Cannot access a property or method of a null object reference.

如何解决这个问题?

不要在加载的 swf 的构造函数中引用 stage。改为订阅 Event.ADDED_TO_STAGE

package {
    import flash.display.MovieClip;
    public class Main extends MovieClip {
        public function Main() {
            trace("1 stage="+stage); // null, if this swf is loaded
            addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
        }
        protected function onAddedToStage(event:Event):void
        {
            trace("2 stage="+stage); // object
        }           
    }
}

更新: 如果您无法修改加载的 swf,您可以在加载程序 swf 中覆盖其主要 class 定义。如果加载的 swf 的 Main class 包含重要的 and/or 不断变化的逻辑,这可能会产生不良后果。

  1. 在你的 loader swf 中定义 Main class
  2. 在 Main 构造函数中使用 ADDED_TO_STAGE 编写适当的操作以正确访问阶段。
  3. 将此 Main 编译到您的加载器 swf 中:只需在主 swf 代码的某处添加 Main;(这也可以通过 flash builder 中的编译器参数来完成,但何必呢)。

这样您就可以完全替换 Main 的定义。