我有一个带有两个对象的flex应用程序:父窗口小部件(称为IBaseWidget)和子窗口小部件(称为HelperWidget2)。当用户单击帮助链接时,帮助程序窗口小部件将加载到基本窗口小部件列表中,然后显示给用户。
但是,当我尝试通过将集合中的基本窗口小部件转换为子窗口小部件类型来访问此子窗口小部件时,子窗口小部件返回null,我无法使用窗口小部件。
以下代码段正确返回新添加的窗口小部件的窗口小部件ID,并调度事件以加载窗口小部件:
var id:Number = WidgetManager.getInstance().getWidgetId("Helper");
ViewerContainer.dispatchEvent(new AppEvent(AppEvent.WIDGET_RUN, id, openQuickQueryCanvas));
加载小部件后,名为openQuickQueryCanvas()的回调函数会尝试使用帮助小部件执行另一个操作:
private function openQuickQueryCanvas():void{
var id:Number = WidgetManager.getInstance().getWidgetId("Helper");
var bWidget:IBaseWidget = WidgetManager.getInstance().getWidget(id) as IBaseWidget;
var helperWidget:HelperWidget2 = bWidget as HelperWidget2;
if(helperWidget != null){
helperWidget.quickQueryCanvas.dispatchEvent(new MouseEvent(MouseEvent.CLICK));//fire an event to open the quick query canvas
}
}
问题是上面的helperWidget总是返回null,这意味着强制转换不成功。这对我来说没有意义,因为bWidget是HelperWidget2类型。
有什么想法?我很难过......
答案 0 :(得分:2)
首先,确保HelperWidget2像这样实现IBaseWidget
public class HelperWidget2 implements IBaseWidget
其次,我建议使用is
关键字而不是强制转换和检查null:
private function openQuickQueryCanvas():void {
var id:Number = WidgetManager.getInstance().getWidgetId("Helper");
var bWidget:IBaseWidget = WidgetManager.getInstance().getWidget(id) as IBaseWidget;
if(bWidget is HelperWidget2)
{
HelperWidget2(bWidget).doWhatever();
}
}
答案 1 :(得分:0)
将返回的实例强制转换为对象,而不是HelperWidget2。在设计时,您不会对方法进行智能感知,但更重要的是,它在运行时不会为空。
var bWidget:Object = WidgetManager.getInstance().getWidget(id);
bWidget.doWhatever();