0

我的应用程序当前包含许多由小部件管理器管理的小部件。当用户点击一个小部件(例如一个 Helper 小部件)时,小部件管理器使用以下代码行将该小部件加载到一个单独的同级应用程序域中:

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

但是,我以后无法使用小部件的变量和函数。我尝试从小部件管理器的小部件列表中找到 Helper 小部件,并且我成功了。但是,当我尝试将 Helper Widget 从 IBaseWidget 类型(所有小部件共享的接口)转换为 HelperWidget 类型时,我收到以下错误:

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

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

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

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

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

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

4

3 回答 3

1

我相信您的问题来自未包含在 swf 中的类。这是因为 Flash 不会在 swf 中的类中编译,如果它们不用于减小文件大小。为了防止这种情况,您只需要在该类中创建一个具有所需帮助类的变量,如下所示:

private var helper:HelperWidget;

看看是否有帮助。

于 2011-04-28T18:06:15.947 回答
1

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

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

    私人 var myFakeObject : HelperWidth;

于 2011-04-28T19:15:26.030 回答
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 小部件中执行功能。

于 2011-05-03T19:41:48.350 回答