0

私のアプリケーションには現在、WidgetManagerによって管理されるいくつかのウィジェットが含まれています。ユーザーがウィジェット(ヘルパーウィジェットなど)をクリックすると、Widget Managerは、次のコード行を使用してウィジェットを別の兄弟アプリケーションドメインにロードします。

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

ただし、後でウィジェットの変数と関数を使用することはできません。Widget Managerのウィジェットのリストからヘルパーウィジェットを見つけようとしましたが、成功しました。しかし、ヘルパーウィジェットをタイプIBaseWidget(すべてのウィジェットが共有するインターフェイス)からタイプHelperWidgetにキャストしようとすると、次のエラーが発生します。

TypeError:エラー#1034:型強制が失敗しました....。

これは、ヘルパーウィジェットを使用しようとしているクラスのアプリケーションドメインが、ヘルパーウィジェットのアプリケーションドメインとは異なるためです。すべてのウィジェットをローダーと同じアプリケーションドメインにロードすることで、これを修正しようとしました。

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

ヘルパーウィジェットを読み込もうとすると、次のエラーが発生します。

TypeError:エラー#1009:nullオブジェクト参照のプロパティまたはメソッドにアクセスできません。

ヘルパーウィジェットを、他のウィジェットからアクセスできる共通のアプリケーションドメインにロードするにはどうすればよいですか?

4

3 に答える 3

1

あなたの問題は、クラスがswfに含まれていないことに起因していると思います。これは、ファイルサイズを縮小するために使用されていない場合、Flashはswfのクラスでコンパイルされないためです。これを防ぐには、次のように、そのクラスで必要なヘルパークラスを使用して変数を作成するだけで済みます。

private var helper:HelperWidget;

それが役立つかどうかを確認してください。

于 2011-04-28T18:06:15.947 に答える
1

本当の答えとして「コメント」を再投稿します。エラーはApplicationDomainに基づいているのではなく、モジュールにコンパイルされているクラスに基づいていると思います。FlexがSWFをコンパイルすると、SWFから未使用のクラスが自動的に最適化されます。次の2つの方法のいずれかで、それらを強制的にSWFに戻すことができます。

  1. コンパイラ引数include-librariesを使用して、FlexコンパイラにクラスをSWFに追加させます。
  2. アプリケーションに偽の変数を追加して、Flexコンパイラがそれが使用されていると判断し、最終的なSWFに追加するようにします。このようなもの。

    private var myFakeObject:HelperWidth;

于 2011-04-28T19:15:26.030 に答える
0

いくつかの解決策(このページの他の応答を含む)を試した後、私は別のイベント駆動型の解決策に頼りました。

ヘルパーウィジェットの読み込みが完了したときに、他のウィジェットに通知するカスタムイベントをディスパッチすることになりました。

(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)をディスパッチして、ヘルパーウィジェット内の機能を実行します。

于 2011-05-03T19:41:48.350 に答える