Ошибка приведения типа при приведении объекта, загруженного в другой домен приложения - PullRequest
0 голосов
/ 28 апреля 2011

Мое приложение в настоящее время содержит несколько виджетов, которые управляются менеджером виджетов. Когда пользователь нажимает на виджет (например, виджет-помощник), менеджер виджетов загружает виджет в отдельный домен приложения-брата со следующей строкой кода:

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

Однако позже я не могу использовать переменные и функции виджета. Я пытаюсь найти виджет «Помощник» из списка виджетов менеджера виджетов, и у меня это получается. Но когда я пытаюсь преобразовать виджет Helper из типа IBaseWidget (интерфейс, который разделяют все виджеты) в тип HelperWidget, я получаю следующую ошибку:

Ошибка типа: ошибка # 1034: сбой приведения типа .....

Это потому, что домен приложения класса, пытающегося использовать виджет Helper, отличается от домена приложения виджета Helper. Я попытался исправить это, загрузив все виджеты в тот же домен приложения, что и загрузчик:

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

Теперь я получаю следующую ошибку, когда пытаюсь загрузить виджет Helper:

TypeError: Ошибка # 1009: не удается получить доступ к свойству или методу ссылки на пустой объект.

Как загрузить виджет Helper в общий домен приложения, доступный для других виджетов?

Ответы [ 3 ]

1 голос
/ 28 апреля 2011

Я собираюсь опубликовать свой «комментарий» как реальный ответ.Я предполагаю, что ошибка основана не на ApplicationDomain, а на том, какие классы вы компилируете в свой Модуль.Когда Flex компилирует SWF, он автоматически оптимизирует неиспользуемые классы из SWF.Вы можете принудительно вернуть их обратно в SWF одним из двух способов:

  1. Используйте аргумент компилятора include-library , чтобы заставить компилятор Flex добавить класс в ваш SWF.
  2. Добавьте в приложение ложную переменную, чтобы компилятор Flex решил, что она используется, и добавьте ее в окончательный SWF-файл.Примерно так.

    private var myFakeObject: HelperWidth;

1 голос
/ 28 апреля 2011

Я полагаю, что ваша проблема связана с тем, что класс не включен в SWF.Это потому, что Flash не компилируется в классах в SWF, если они не используются для уменьшения размера файла.Чтобы предотвратить это, вам нужно всего лишь создать переменную с нужным классом помощников в этом классе, например:

private var helper:HelperWidget;

Посмотрите, поможет ли это.

0 голосов
/ 03 мая 2011

После неудачного решения ряда решений (включая другие ответы на этой странице) я прибег к другому решению, основанному на событиях.

В итоге я отправил пользовательское событие, чтобы уведомить мои другие виджеты о завершении загрузки виджета Помощник:

(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.

...