Flex AIR: 使用透明 NativeWindow 窗体呈现 Line Chart 的一个 bug (Exception in CartesianChart/updateMultipleAxesStyles)

经过昨天一整天的反复试验、排错和线上检索,发现 AIR 在使用透明(transparent=true, showFlexChrome=false)的 NativeWindow 包裹一个含有 mx:LineChart 组件的 Window 窗体时,只要 mxml 文中出现任一个 <mx:LineChart/> 标记,就会报告以下异常,然后程式终止运行:

 

TypeError: Error #1009: Cannot access a property or method of a null object reference.
 at mx.charts.chartClasses::CartesianChart/updateMultipleAxesStyles()[E:\dev\4.0.0\frameworks\projects\datavisualization\src\mx\charts\chartClasses\CartesianChart.as:2598]
 at mx.charts.chartClasses::CartesianChart/commitProperties()[E:\dev\4.0.0\frameworks\projects\datavisualization\src\mx\charts\chartClasses\CartesianChart.as:1360]
 at mx.core::UIComponent/validateProperties()[E:\dev\4.0.0\frameworks\projects\framework\src\mx\core\UIComponent.as:7772]
 at mx.managers::LayoutManager/validateProperties()[E:\dev\4.0.0\frameworks\projects\framework\src\mx\managers\LayoutManager.as:572]
 at mx.managers::LayoutManager/doPhasedInstantiation()[E:\dev\4.0.0\frameworks\projects\framework\src\mx\managers\LayoutManager.as:700]
 at mx.managers::LayoutManager/doPhasedInstantiationCallback()[E:\dev\4.0.0\frameworks\projects\framework\src\mx\managers\LayoutManager.as:1072]

 

据说是因为 Flex 内部代码中一个叫做 hslen 的对象取不到 horizontalAxisStyleName 的 len 引起的。莫名其妙。

 

更莫名奇妙的是,在一个比较简单的 AIR project 里使用相同参数配置是没有出现这个现象的。唯一的区别是发生异常的前者使用一个从文件中读取的  XML 作为这个 Line Chart 的数据源,没有发生异常的后者使用定义 XML 的方式作为这个 Line Chart 的数据源,虽然两份 XML 文本是一致的,参数配置是一致的,除数据源外的代码是一致的,但是结果截然不同。

 

看来不仅与透明窗体有关,也跟数据源定义方式、跟程式规模(SWF解压后占用的字节规模)有关。

 

在 fx:Script 里声明一个 LineChart 对象不会报异常,然而这样是不能把图形呈现出来的。

 

解决办法只能是不使用透明的 NativeWindow 包裹,直接对 Window 窗体实施 open() 调用。虽然这样不能去掉 OS 的镶边、不能做不规则外形的透明窗体,但是至少可以把图形呈现出来。

 

在Google上搜寻相关问题只得三个结果,而且自2009年2月至今都是未解之谜。百度就一个结果都没有。看来这是 Flex AIR 长久的 bug 了。

 

调试环境是 AIR 2.02, 1.5, Flash Builder 4.0 Premium.

 

你可能感兴趣的:(Flex AIR: 使用透明 NativeWindow 窗体呈现 Line Chart 的一个 bug (Exception in CartesianChart/updateMultipleAxesStyles))