PDA

Просмотр полной версии : ModuleLoader => интерфейс => Error #1009


Lexa_
26.10.2009, 19:16
В основном приложении подгружается модуль. Общение с модулем через интерфейс. При создании экземпляра получаю нулевой объект и соответсвенно ошибку 1009.
Интерфейс:

package ifc
{
public interface StatusBarIfc
{
function logInfo(eventType:String,eventText:String = ""):void;
}
}


Модуль:

<mx:Module xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" implements="ifc.StatusBarIfc">
<mx:Script>
<![CDATA[

public function logInfo(eventType:String,eventText:String = ""):void {
log.htmlText += eventType + eventText + "\r";
}
}
]]>
</mx:Script>
<mx:Text id="log"/>
</mx:Module>


Основное приложение:

<mx:Script>
<![CDATA[
import ifc.StatusBarIfc;

public var statusIfc:StatusBarIfc;

private function initApp():void
{
loadModule(mainStatusbar,"StatusBar.swf");
statusIfc = mainStatusbar.child as StatusBarIfc;
statusIfc.logInfo("Start application.");
}
]]>
</mx:Script>

wvxvw
26.10.2009, 23:07
Ну тут сразу много всего одновременно:
Module - это не документ класс модуля, документ класс - это какая-нибудь имплементация IFlexModuleFactory она будет чем-то типа SystemManager для модуля.
В AS3 имена интерфейсов должны начинаться с прописной "I".
Кроме того, я чесно не знаю, и лень разбираться с тем, как именно Флекс грузит модули, есть вариант при котором у вас могут оказаться 2 интерфейса с одинаковыми названиями но в разных ApplicationDomain. В таком случае естественно, нужно будет грузить модули самому и в "правильный" домейн.

Lexa_
27.10.2009, 19:55
Я использую ModuleLoader, а IFlexModuleFactory нужен для ModuleManager. В общем сакральный смысл интерфейсов мне постичь не удалось. Пришлось поступить трусливо, обьявить интерфейс расширением IEventDispatcher и общаться с ним через события. Работает, данные передаются, но морального удовлетворения нет. Если кто расскажет как правильно общаться с модулями - буду благодарен. Потому как сам не могу понять. В Flex 3 Cookbook вообще написано When using an <mx:ModuleLoader> object, the module instance is available from the child property:
а так не работает нифига, даже с примером из этой книги. В общем вот новый код интерфейса и кусок кода приложения:


package ifc
{
import flash.events.IEventDispatcher;
public interface IStatusBar extends IEventDispatcher
{
function logInfo(eventType:String,eventText:String = ""):void;
}
}



<mx:Script>
<![CDATA[
public var statusIfc:IStatusBar;
private function initApp():void
{
loadModule(mainStatusbar,"StatusBar.swf");
}
public function statusInterface():void {
statusIfc = mainStatusbar.child as IStatusBar;
}
private function connectHandler(event:Event):void {
statusIfc.logInfo(event.type);
}
]]>
</mx:Script>
<mx:Canvas>
<mx:ModuleLoader id="mainStatusbar" ready="statusInterface()"/>
</mx:Canvas>

wvxvw
27.10.2009, 22:38
Я использую ModuleLoader, а IFlexModuleFactory нужен для ModuleManager. В общем сакральный смысл интерфейсов мне постичь не удалось. Пришлось поступить трусливо, обьявить интерфейс расширением IEventDispatcher и общаться с ним через события. Работает, данные передаются, но морального удовлетворения нет. Если кто расскажет как правильно общаться с модулями - буду благодарен. Потому как сам не могу понять. В Flex 3 Cookbook вообще написано
Это типа "слышал звон..." Модуль, как и любое другое флексовое фреймворковское приложение состоит из 2+ кадров. <Module> - это класс фабрика второго кадра, а первый кадр, он же документ класс - это какой-нибудь имплементатор IFlexModuleFactory. Теоретически, вы можете создать свой класс, который заменит систем менеджер вашему модулю. Но практически это и трудозатратно, да и смысла особого не имеет. Вы на самом деле все начинали делать правильно, просто вы не то кастовали (но к правильному интерфейсу). Вы кастовали систем манагер модуля вместо того, чтобы кастовать его класс второго кадра.

Lexa_
28.10.2009, 14:52
Пальцем ткнуть можете? :) Потому как прочитав это я совсем запутался :)
It loads SWF files and adds modules to the display list of an application. ModuleLoader differs from SWFLoader in that it has a contract that dictates that the SWF file that is loaded implements IFlexModuleFactory. Compiled modules contain the IFlexModuleFactory class factory, which allows an application to dynamically load the modular SWF files at runtime without requiring the class implementations within the main application shell.

When you typecast the values returned from the child property of ModuleLoader or the Object returned from the IFlexModuleFactory.create method to that of the loaded module, you introduce a tight coupling between the module and the loading application.

wvxvw
28.10.2009, 23:47
Смотрите, самый простой вариант:
trace(describeType(mainStatusbar.child));
Сразу развеет все сомнения и подозрения.

Вариант с извращением:
Скомпилировать с -keep и посмотреть, а что именно у вас получилось, когда вы компилировали.

boombooroom
29.10.2009, 15:02
Сам недавно столкнулся с похожей проблемой. Решил ее с помощью события creationComplete у Module. Использовал его непосредственно в mxml модуля. В этот момент все свойства и методы модуля подгружены и их можно спокойно юзать.

Lexa_
10.11.2009, 17:11
Нашел в чем была причина. Компилишь под FP9 - все работает, модули через интерфейсы общаются, фрилав, лигалайз и полное взаимопонимание. Компилишь под FP10 - получаешь Error #1009. Скорее всего глюк в SDK.