【问题标题】:ActionScript: making a variable `[Bindable]` causes crashesActionScript:制作变量 `[Bindable]` 会导致崩溃
【发布时间】:2015-10-09 23:02:13
【问题描述】:

我有这个单例,我用它作为全局变量和常量的包装器,但是当我创建一些 [Bindable] 时,我在控制台中启动时崩溃了/一堆红色文本。

TypeError:错误 #1009:无法访问空对象引用的属性或方法。
    在 BrandGlobals$/get COLOUR_EVERYTHING_BACKGROUND()[C:\MyProject\src\BrandGlobals.as:14]
    在 BrandGlobals$cinit()
    在 global$init()[C:\MyProject\src\BrandGlobals.as:2]
    在 _mainWatcherSetupUtil/setup()
    在 main/initialize()[C:\MyProject\src\main.mxml:0]
    在 mx.managers::SystemManager/http://www.adobe.com/2006/flex/mx/internal::childAdded()[C:\autobuild\3.5.0\frameworks\projects\framework\src\mx\经理\SystemManager.as:2131]
    在 mx.managers::SystemManager/initializeTopLevelWindow()[C:\autobuild\3.5.0\frameworks\projects\framework\src\mx\managers\SystemManager.as:3400]
    在 mx.managers::SystemManager/http://www.adobe.com/2006/flex/mx/internal::docFrameHandler()[C:\autobuild\3.5.0\frameworks\projects\framework\src\mx\经理\SystemManager.as:3223]
    在 mx.managers::SystemManager/docFrameListener()[C:\autobuild\3.5.0\frameworks\projects\framework\src\mx\managers\SystemManager.as:3069]

全球品牌:

package {
public final class BrandGlobals {
    [Bindable]public static var COLOUR_EVERYTHING_BACKGROUND:uint = 0xE010FF;

如果我删除 [Bindable] 并将 var 转换为 const 没有问题(除了无法在此文件之外设置变量的明显问题),但这不起作用。此外,让整个班级[Bindable] 而不是这个班级也行不通。当我将鼠标悬停在COLOUR_EVERYTHING_BACKGROUND 定义上时,它会显示“”。 '不知道该怎么想。

我可能已经猜到这是因为它没有包,但我正在使用另一个类似的单例,它有 [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;
}

并且断点表明它永远不会被调用。

【问题讨论】:

  • 运行时是否看到“Var set”跟踪?
  • 不,但我想通了。

标签: actionscript-3 data-binding


【解决方案1】:

事实证明,问题在于将COLOUR_EVERYTHING_BACKGROUND 分配给代码中其他地方的static const,作为临时措施。希望我会记得将[Bindable]s 分配给static consts 是不好的,如果我不这样做,我会记得Flash Builder 的那种特殊神秘反应的含义。我开始因有关神秘错误消息的问题而窒息 StackOverflow。

【讨论】:

    【解决方案2】:

    编辑:在尝试读取变量之前,您需要确保变量已初始化。静态初始化器是要走的路:

    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
    • @Opux 这改变了一切!我已经相应地更新了我的答案。
    • 没有骰子。以上更新。
    • 我尝试做的其他事情是删除 _COLOUR_EVERYTHING_BACKGROUND 直到 SetBackground() 的所有初始化。现在它已经停止崩溃了,但是在SetBackground() 之后创建的所有内容自然都没有更新,因为COLOUR_EVERYTHING_BACKGROUND 不是[Bindable](而且不可能,因为它是一个静态函数)。
    【解决方案3】:

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

    【讨论】:

    • 太棒了。但是我仍然不知道为什么我在使用[Bindable] 时会出现运行时错误。
    • @Opuxtry 看看示例代码,这是预期的行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 2016-12-14
    • 2018-02-24
    • 2020-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多