如何在主SWF加载子SWF完成后获取子SWF引用并传递参数?
解决Flex中加载子SWF后获取组件引用并传递参数的问题
你遇到的这个问题是Flex开发里的常见场景——Flex编译生成的SWF文件,它的根内容并不是你写的TestFile2组件,而是SystemManager(这就是你弹窗看到[object_TestFile2_mx_managers_SystemManager]的原因)。Flex框架会自动用SystemManager包装整个应用,所以直接把loader.content强转成TestFile2自然会得到null。
下面是具体的解决思路和修改后的代码:
核心逻辑
- 先获取加载完成后的
SystemManager实例 - 监听
SystemManager的FlexEvent.APPLICATION_COMPLETE事件——子SWF加载完成后,内部的Application组件可能还在初始化,必须等这个事件触发才能安全拿到你的TestFile2实例 - 从
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
相关产品推荐
相关产品推荐

