我有这个单例,我正在使用它作为全局变量和常量的包装,但是一旦我做了一些[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
定义上时,它会显示“< getter引发的异常>”。 “不知道该怎么想。
我可能已经猜到这是因为它没有包,但我正在使用另一个类似的单例,它有[Bindable]
个变量,似乎工作正常。
我从来没有得到[Bindable]
twaddle。
我正在使用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;
}
和断点表示永远不会调用它。
答案 0 :(得分:0)
documentation on using the tag有以下说法:
使用静态属性作为数据绑定的来源
您可以使用静态变量作为数据绑定表达式的源。 Flex在应用程序启动时执行一次数据绑定,在属性更改时再次执行数据绑定。
您可以自动使用静态常量作为数据绑定表达式的源。 Flex在应用程序启动时执行一次数据绑定。由于数据绑定仅在应用程序启动时发生一次,因此省略静态常量的[Bindable]元数据标记。以下示例使用静态常量作为数据绑定表达式的源:
<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}"/>
答案 1 :(得分:0)
编辑:您需要确保在尝试读取变量之前初始化变量。静态初始化器是可行的方法:
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;
}
在指定的位置放置断点将允许您验证事物是否按预期顺序执行
答案 2 :(得分:0)
事实证明,问题是将COLOUR_EVERYTHING_BACKGROUND
分配给代码中其他地方的static const
,作为临时措施。希望我会记得将[Bindable]
分配给static const
s很糟糕,如果我不这样做,我会记住Flash Builder特有的神秘反应的意义。我开始用我关于神秘错误消息的问题来阻止StackOverflow。