开发者问题收集

ActionScript:创建变量 `[Bindable]` 会导致崩溃

2015-07-20
187

我有一个单例,用作全局变量和常量的包装器,但只要我创建一些 [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;
}

并且断点表明它从未被调用过。

3个回答

有关使用该标签的文档 有以下内容:

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}"/>    

null
2015-07-20

编辑:您需要确保在尝试读取变量之前对其进行初始化。静态初始化程序是可行的方法:

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;
    }

在指定位置设置断点将让您验证事情是否按预期顺序执行

Brian
2015-07-20

事实证明,问题在于将 COLOUR_EVERYTHING_BACKGROUND 分配给代码中其他位置的 static const ,作为一种临时措施。希望我能记住将 [Bindable] 分配给 static const 是不好的,如果我不记得,我会记住 Flash Builder 的那个特定的神秘反应的含义。我开始用有关神秘错误消息的问题堵住 StackOverflow。

Opux
2015-07-22