【问题标题】:Flex / ActionScript3 - Object Attribute / Variable nullFlex / ActionScript3 - 对象属性/变量 null
【发布时间】:2023-03-13 19:57:01
【问题描述】:

如果我在 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" width="45" height="59"
   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" width="40" height="6" alpha="{showData.value}">
  <s:fill>
   <s:SolidColor color="#000000"/>
  </s:fill>
 </s:Rect>

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

</s:Group>

【问题讨论】:

    标签: apache-flex actionscript-3 object null components


    【解决方案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],你不应该需要它。

      【讨论】:

        猜你喜欢
        • 2017-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多