You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在主SWF加载子SWF完成后获取子SWF引用并传递参数?

解决Flex中加载子SWF后获取组件引用并传递参数的问题

你遇到的这个问题是Flex开发里的常见场景——Flex编译生成的SWF文件,它的根内容并不是你写的TestFile2组件,而是SystemManager(这就是你弹窗看到[object_TestFile2_mx_managers_SystemManager]的原因)。Flex框架会自动用SystemManager包装整个应用,所以直接把loader.content强转成TestFile2自然会得到null。

下面是具体的解决思路和修改后的代码:

核心逻辑

  1. 先获取加载完成后的SystemManager实例
  2. 监听SystemManager的FlexEvent.APPLICATION_COMPLETE事件——子SWF加载完成后,内部的Application组件可能还在初始化,必须等这个事件触发才能安全拿到你的TestFile2实例
  3. 从SystemManager的application属性中提取真正的TestFile2对象,再进行参数传递

修改后的代码示例

public var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, myFun);
// 你的LoaderContext配置没问题,确保了主SWF能访问子SWF的类域
loader.load(new URLRequest("/view/flex/TestFile2.swf"), new LoaderContext(false, ApplicationDomain.currentDomain));
viewId.addChild(loader);

public function myFun(event:Event):void{
    var loaderInfo:LoaderInfo = event.target as LoaderInfo;
    var systemManager:SystemManager = loaderInfo.content as SystemManager;
    // 监听子应用初始化完成事件
    systemManager.addEventListener(FlexEvent.APPLICATION_COMPLETE, onSubAppReady);
}

private function onSubAppReady(event:FlexEvent):void{
    var systemManager:SystemManager = event.target as SystemManager;
    // 移除监听避免重复触发
    systemManager.removeEventListener(FlexEvent.APPLICATION_COMPLETE, onSubAppReady);
    
    // 从SystemManager中获取TestFile2实例
    var testfile2:TestFile2 = systemManager.application as TestFile2;
    if(testfile2){
        testfile2.param1 = "val1";
        Alert.show("参数已成功传递给子SWF");
    } else {
        Alert.show("无法获取TestFile2实例,请检查子SWF的类访问权限或编译配置");
    }
}

额外注意点

  • 确保子SWF中的TestFile2类是public访问权限,否则主SWF无法直接进行类型转换
  • 你设置的ApplicationDomain.currentDomain非常关键,它保证了主SWF能访问子SWF中的类定义,否则即使拿到实例也无法转换成目标类型

内容的提问来源于stack exchange,提问作者pravin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:45:36