Flex / ActionScript3 - 对象属性/变量 null

Posted

技术标签:

【中文标题】Flex / ActionScript3 - 对象属性/变量 null【英文标题】:Flex / ActionScript3 - Object Attribute / Variable null 【发布时间】:2011-06-04 16:33:48 【问题描述】:

如果我在 FlashBuilder 中执行下面的代码,我会得到以下错误(我翻译它)

TypeError: Error #1009: Access to an Attribute or Method of an null-Object is not possible.
 at components::NumDisplay()[\src\components\NumDisplay.mxml:39]

NumDisplay.mxml中的这一行就是问题所在:

[Bindable]
public var oneled_top:OneDisplay = new OneDisplay(numberData.led_top);

如果我把它从上面改成:

[Bindable]
public var oneled_top:OneDisplay = new OneDisplay(1);

它正在工作,因为我发送了一个实数。 那么如何访问 numberData.led_top 的值呢?

如果我在同一个文件 NumDisplay.mxml 中测试访问

<s:Label text="numberData.led_top" color="#FF0000">
</s:Label>

它访问值,就像我把它放在我的组件中一样

<components:oneLedDisplay showData="numberData.led_top" x="10" y="10" />

搜索了几个小时后我没有得到它... 提前致谢。

我的主要方法tasachenrechner.mxml

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
      xmlns:s="library://ns.adobe.com/flex/spark" 
      xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="600" minHeight="500" xmlns:components="components.*">
 <fx:Script>
            <![CDATA[
   import components.NumberDisplay;
   [Bindable]
   protected var firstNumber:NumberDisplay = new NumberDisplay(1);
   [Bindable]
   protected var secondNumber:NumberDisplay = new NumberDisplay(2);
             ]]>
 </fx:Script>

 <components:NumDisplay
  numberData="firstNumber"
  x="10" 
  y="20"/>

 <components:NumDisplay 
  numberData="secondNumber"
  x="73" 
  y="20"/>

</s:Application>

我的 AS-Class NumberDisplay.as

package components

 import flash.display.DisplayObject;

 [Bindable]
 public class NumberDisplay
 
  public var num:Number;

  public var led_top:Number=0;
  public var led_r1:Number=0;
  public var led_r2:Number=0;
  public var led_middle:Number=0;
  public var led_l1:Number=0;
  public var led_l2:Number=0;
  public var led_bottom:Number=0;

  public function NumberDisplay(num:Number)
  
   this.num = num;
   switch(this.num)
   
    case 0:
     trace("ZERo");
     break;
    case 1:
     led_top = 1;
     led_r1 = 1;
     led_r2 = 1
     trace("EINS" + led_top + " num:" + num);
     break;
                            //[... some more cases]
    default:
     break;
   
  
 

我的NumDisplay.mxml

<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
   xmlns:s="library://ns.adobe.com/flex/spark" 
   xmlns:mx="library://ns.adobe.com/flex/mx"  
   xmlns:components="components.*">

 <fx:Style>
  @namespace s "library://ns.adobe.com/flex/spark";
  @namespace mx "library://ns.adobe.com/flex/mx";
  @namespace components "components.*";
 </fx:Style>

 <fx:Script>
  <![CDATA[
   import components.NumberDisplay;
   import components.OneDisplay;

   [Bindable]
   public var numberData:NumberDisplay;

   [Bindable]
   public var oneled_top:OneDisplay = new OneDisplay(numberData.led_top);
                        // some more init calls of data-objects same type
  ]]>
 </fx:Script>


 <s:Label text="numberData.led_top" color="#FF0000">
 </s:Label>

 <components:oneLedDisplay showData="oneled_top" x="10" y="10" />
        // some more objects of same type
</s:Group>

我的 AS-Class OneDisplay.as

package components

 import flash.display.DisplayObject;

 public class OneDisplay
 
  [Bindable]
  public var show:Number;
  [Bindable]
  public var value:Number=0;

  public function OneDisplay(show:Number)
  
   this.show = show;
   switch(this.show) 
   
    case 0:
     value = 0.3;
     trace(value);
     break;
    case 1:
     value = 1.0;
     trace(value);
     break;
   
  
 

我的 oneLedDisplay.mxml

<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
   xmlns:s="library://ns.adobe.com/flex/spark" 
   xmlns:mx="library://ns.adobe.com/flex/mx">
 <fx:Script>
  <![CDATA[
   import components.OneDisplay;
   [Bindable]
   public var showData:OneDisplay;
  ]]>
 </fx:Script>

 <s:Rect id="stroke"   alpha="showData.value">
  <s:fill>
   <s:SolidColor color="#000000"/>
  </s:fill>
 </s:Rect>

 <s:Label text="showData.value" color="#FF0000">
 </s:Label>

</s:Group>

【问题讨论】:

【参考方案1】:

请记住,您不仅要赋值,还要声明成员变量oneled_top。此时,您无法访问numberData,因为它还没有被实例化(没有对new NumberData() 的调用!你必须找到一种方法在以后调用new OneDisplay (numberData.led_top),当实际上有一个访问的价值。

【讨论】:

+1 以获得对该问题的可靠解释。就未来可以访问的值而言,我建议使用 commitProperties() (就像我在回答中所做的那样)。【参考方案2】:

您提供了很多我不想逆向工程的代码。

答案是 oneled_top 在 numberData 之前被初始化。使用 MXML 时,您无法控制变量的初始化。

在 commitProperties() 方法中设置默认值,或者如果 oneled_Top 应该是皮肤部件,请在 PartAdded 方法中设置默认值。

阅读Component Lifecycle,您会受益匪浅。

【讨论】:

【参考方案3】:

可以使用BindingUtils.bindSetter()检测numberData的变化,然后初始化oneled_top

BindingUtils.bindSetter(_setOneLabel_top, this, "numberData");

和二传手:

function _setOneLabel_top(disp:NumberDisplay):void

  /* if(this.oneled_top == null) */
  this.oneled_top = new OneDisplay(disp.led_top);

但我认为,你使用的是 [Bindable],你不应该需要它。

【讨论】:

以上是关于Flex / ActionScript3 - 对象属性/变量 null的主要内容,如果未能解决你的问题,请参考以下文章

Actionscript 3 和 Flex 4 通过触摸滚动 TileList

有啥方法可以将 ActionScript 3 (Flex/AIR) 项目打印到标准输出?

将arrayCollection从flex传递给java

需要帮助使用 Flex/ActionScript 3 创建平滑的翻转或 FishEye 效果

SWFLoader 上的 Actionscript 3 和 Flex 4 缩放手势

如何将自定义类导入 Flex 中的 mxml 文件? (动作脚本 3)