ActionScript:使变量`[Bindable]`导致崩溃

时间:2015-07-20 17:44:15

标签: actionscript-3 data-binding

我有这个单例,我正在使用它作为全局变量和常量的包装,但是一旦我做了一些[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;
}

和断点表示永远不会调用它。

3 个答案:

答案 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。