在转换加载在不同应用程序域中的对象时键入强制错误

时间:2011-04-28 16:54:48

标签: flex casting loader typeerror applicationdomain

我的应用程序当前包含许多由Widget Manager管理的小部件。当用户点击窗口小部件(例如帮助窗口小部件)时,窗口小部件管理器将窗口小部件加载到单独的兄弟应用程序域中,并带有以下代码行:

wgtInfo.load(null, null, null, moduleFactory); //wgtInfo = IModuleInfo

但是,我以后无法使用窗口小部件的变量和函数。我试图从Widget Manager的小部件列表中找到Helper小部件,我做得很成功。但是当我尝试从类型IBaseWidget(界面所有小部件共享)中将Helper Widget类型化为HelperWidget类型时,我收到以下错误:

  

TypeError:错误#1034:类型强制失败.....

这是因为尝试使用Helper小部件的类的应用程序域与Helper Widget的应用程序域不同。我尝试通过将所有小部件加载到与加载器相同的应用程序域中来解决此问题:

wgtInfo.load(ApplicationDomain.currentDomain, null, null, moduleFactory);

每当我尝试加载Helper小部件时,我现在都会收到以下错误:

  

TypeError:错误#1009:无法访问空对象引用的属性或方法。

如何将我的帮助程序窗口小部件加载到其他窗口小部件可访问的公共应用程序域中?

3 个答案:

答案 0 :(得分:1)

我相信你的问题来自于不包括在瑞士法郎中的课程。这是因为如果不使用Flash来减少文件大小,则Flash不会在swf中的类中进行编译。为了防止这种情况,您只需要在该类中创建一个包含所需助手类的变量,如下所示:

private var helper:HelperWidget;

看看是否有帮助。

答案 1 :(得分:1)

我要把我的“评论”作为一个真正的答案重新发布。我猜测错误不是基于ApplicationDomain,而是基于您正在编译到模块中的类。当Flex编译SWF时,它会自动优化SWF中未使用的类。您可以通过以下两种方式之一强制它们返回SWF:

  1. 使用编译器参数include-libraries强制Flex编译器将类添加到SWF中。
  2. 在应用程序中添加一个伪变量,以便Flex编译器认为它已被使用并将其添加到最终的SWF中。这样的事情。

    private var myFakeObject:HelperWidth;

答案 2 :(得分:0)

在尝试了许多解决方案失败后(包括此页面上的其他响应),我采用了另一个事件驱动的解决方案。

当Helper小部件完成加载时,我最终调度了一个自定义事件来通知我的其他小部件:

(HelperWidget.mxml)

ViewerContainer.addEventListener(AppEvent.WIDGET_OPEN_TAB, widgetOpenTabHandler); //listen for other widgets to open a tab within the Helper Widget
ViewerContainer.dispatchEvent(new AppEvent(AppEvent.WIDGET_READY_OPEN_TAB)); //notify other widgets that loading is complete

我的其他小部件会侦听此事件,并在完成后调度另一个事件(AppEvent.WIDGET_OPEN_TAB)以在Helper小部件中执行一个函数。

相关问题