ActionScript:创建变量 `[Bindable]` 会导致崩溃
我有一个单例,用作全局变量和常量的包装器,但只要我创建一些
[Bindable]
,启动时就会崩溃,控制台中会出现一堆红色文本。
TypeError: Error #1009: Cannot access a property or method of a null object reference. at BrandGlobals$/get COLOUR_EVERYTHING_BACKGROUND()[C:\MyProject\src\BrandGlobals.as:14] at BrandGlobals$cinit() at global$init()[C:\MyProject\src\BrandGlobals.as:2] at _mainWatcherSetupUtil/setup() at main/initialize()[C:\MyProject\src\main.mxml:0] at mx.managers::SystemManager/http://www.adobe.com/2006/flex/mx/internal::childAdded()[C:\autobuild\3.5.0\frameworks\projects\framework\src\mx\managers\SystemManager.as:2131] at mx.managers::SystemManager/initializeTopLevelWindow()[C:\autobuild\3.5.0\frameworks\projects\framework\src\mx\managers\SystemManager.as:3400] at mx.managers::SystemManager/http://www.adobe.com/2006/flex/mx/internal::docFrameHandler()[C:\autobuild\3.5.0\frameworks\projects\framework\src\mx\managers\SystemManager.as:3223] at mx.managers::SystemManager/docFrameListener()[C:\autobuild\3.5.0\frameworks\projects\framework\src\mx\managers\SystemManager.as:3069]
BrandGlobals:
package {
public final class BrandGlobals {
[Bindable]public static var COLOUR_EVERYTHING_BACKGROUND:uint = 0xE010FF;
如果我删除那个
[Bindable]
并将
var
转换为
const
,则不会出现问题(除了无法在此文件之外设置变量的明显问题),但这不起作用。此外,将整个类改为
[Bindable]
而不是这个类也不起作用。当我将鼠标悬停在
COLOUR_EVERYTHING_BACKGROUND
定义上时,它会显示“<exception thrown by getter>”。 “不知道该怎么想。
我可能已经猜到这是因为它没有包,但是我正在使用另一个类似的单例,它有
[Bindable]
变量并且似乎工作正常。
我从来没有得到过那个
[Bindable]
废话。
我正在使用 Flex 3.5 SDK。
我尝试了 Brian 的以下建议,但它给了我几乎相同的错误。我甚至尝试过:
{
_COLOUR_EVERYTHING_BACKGROUND = 0xE010FF;
trace("Var set."); //Breakpoint here
bLoadedFerCryinOutLoud = true;
}
[Bindable]private static var _COLOUR_EVERYTHING_BACKGROUND:uint;
private static var bLoadedFerCryinOutLoud:Boolean = false;
public static function get COLOUR_EVERYTHING_BACKGROUND():uint {
trace("Returning EVERYTHING background");
if (bLoadedFerCryinOutLoud)
return _COLOUR_EVERYTHING_BACKGROUND;
else return 0xFFFFFF;
}
此外,如果我在
trace("Var set.");
处设置断点,Flash Builder 会抱怨无法中断,因为那里没有可执行代码。
我还注意到,在
set
期间发生此崩溃时显示的调用堆栈中,它似乎是设置
_COLOUR_EVERYTHING_BACKGROUND
的那个。但唯一设置它的地方是:
public static function SetBackground(oApp:UBIApplication):void {
_COLOUR_EVERYTHING_BACKGROUND = oApp.nBackgroundColour;
}
并且断点表明它从未被调用过。
有关使用该标签的文档 有以下内容:
Using static properties as the source for data binding
You can use a static variable as the source for a data-binding expression. Flex performs the data binding once when the application starts, and again when the property changes.
You can automatically use a static constant as the source for a data-binding expression. Flex performs the data binding once when the application starts. Because the data binding occurs only once at application start up, you omit the [Bindable] metadata tag for the static constant. The following example uses a static constant as the source for a data-binding expression:
<fx:Script>
<![CDATA[
// This syntax casues a compiler error.
// [Bindable]
// public static var varString:String="A static var.";
public static const constString:String="A static const.";
]]>
</fx:Script>
<!-- This binding occurs once at application startup. -->
<s:Button label="{constString}"/>
编辑:您需要确保在尝试读取变量之前对其进行初始化。静态初始化程序是可行的方法:
package {
public final class BrandGlobals {
{
_COLOUR_EVERYTHING_BACKGROUND = 0xE010FF;
trace("Var set."); //Breakpoint here
}
[Bindable]private static var _COLOUR_EVERYTHING_BACKGROUND:uint;
public static function get COLOUR_EVERYTHING_BACKGROUND():uint {
trace("Returning EVERYTHING background"); //Breakpoint here
return _COLOUR_EVERYTHING_BACKGROUND;
}
在指定位置设置断点将让您验证事情是否按预期顺序执行
事实证明,问题在于将
COLOUR_EVERYTHING_BACKGROUND
分配给代码中其他位置的
static const
,作为一种临时措施。希望我能记住将
[Bindable]
分配给
static const
是不好的,如果我不记得,我会记住 Flash Builder 的那个特定的神秘反应的含义。我开始用有关神秘错误消息的问题堵住 StackOverflow。