我正在尝试使用 Apache Flex SDK 4.12.1 使用 Flex 模块对模块化应用程序架构进行原型设计。我有以下项目结构。
CommonLib 弹性库。该项目包含一个文件,IPlugin.,如下所示。
{ import mx.core.IVisualElement; public interface IPlugIn { function get MyPlugin():IVisualElement; } }
ModuleProject 弹性应用程序。该项目包含两个文件。PluginModule.mxml 是我要加载的模块,而 DemoForm.mxml 是我要添加到主应用程序的组件。
// PluginModule.mxml <?xml version="1.0" encoding="utf-8"?> <s:Module xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" xmlns:local="*" implements="Interfaces.IPlugIn"> <fx:Script> <![CDATA[ import mx.core.IVisualElement; private var _myPlugin:DemoForm = new DemoForm(); protected function button1_clickHandler(event:MouseEvent):void { container.addElement(new DemoForm()); } public function get MyPlugin():IVisualElement { if (_myPlugin == null) _myPlugin = new DemoForm(); return _myPlugin; } ]]> </fx:Script> <s:HGroup> <s:Button id="btn" label="Add DemoForm" click="button1_clickHandler(event)"/> <s:VGroup id="container"/> </s:HGroup> </s:Module> // Demoform.mxml <?xml version="1.0" encoding="utf-8"?> <s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" width="400"> <s:layout> <s:TileLayout/> </s:layout> <s:Button label="Button 1"/> <s:TextInput/> </s:Group>
FlexProject 弹性应用项目。这包含一个文件,目的是将 PluginModule和DemoForm.mxml 加载到它的 BorderContainer 中。
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"> <fx:Script> <![CDATA[ import mx.core.IVisualElement; import mx.events.ModuleEvent; import mx.modules.IModuleInfo; import mx.modules.ModuleManager; import Interfaces.IPlugIn; private var moduleInfo:IModuleInfo; protected function button1_clickHandler(event:MouseEvent):void { moduleInfo = ModuleManager.getModule("PluginModule.swf"); moduleInfo.addEventListener(ModuleEvent.READY, renderModule); moduleInfo.load(null, null, null, this.moduleFactory); } private function renderModule(event:ModuleEvent):void { var module:Object = moduleInfo.factory.create(); var plugin:IPlugIn = module as IPlugIn; container.addElement(plugin as IVisualElement); // <-- Works! container.addElement(plugin.MyPlugin); // <-- Error: Skin cannot be found } ]]> </fx:Script> <mx:VBox> <s:Button click="button1_clickHandler(event)" label="Add Plugin"/> <s:BorderContainer id="container"> <s:layout> <s:VerticalLayout gap="10"/> </s:layout> </s:BorderContainer> </mx:VBox> </s:Application>
我可以将模块直接添加到应用程序的容器中,一切似乎都正常。然后应用程序容器将显示由 PluginModule.mxml 实现的 1 按钮。但是,当我尝试通过 plugin.MyPlugin 方法将 Demoform 添加到应用程序的容器时,我收到以下错误。
错误:无法找到 FlexProject.ApplicationSkin2.containerGrp.contentGroup.VBox5.container.BorderContainerSkin10.Group11.DemoForm13.RadioButton16 的皮肤。
我已经尝试了许多不同的控件,包括 TextArea、TextInput 和 RadioButtons。这些都因类似的错误而失败。似乎主应用程序找不到这些组件的皮肤!
有趣的是,如果我改为允许 PluginModule.mxml 将 DemoForm.mxml 添加到它自己的容器中,它就可以正常工作。虽然,这不是我想要的行为。
关于可能发生的事情以及我如何解决它的任何建议?