简体   繁体   中英

Runtime error on ItemRenderer in Flex 2

When I run my Flex 2 app I get the following runtime error:

TypeError: Error #1009: No se puede acceder a una propiedad oa un método de una referencia a un objeto nulo.

In other words, the Flex SDK is telling me that the "lb" variable inside my ItemRenderer is null (I checked with debugger and yes, it is really null) What am I doing wrong?

The line which triggers the error is this one:

<mx:TileList variableRowHeight="true" liveScrolling="false" width="100%" textAlign="left"     height="100%" columnCount="2"  dataProvider="{model.specialfield_issue_list}" itemRenderer="org.nevis.cairngorm.mod.view.IRCampoEspecial" direction="horizontal"></mx:TileList>

<?xml version="1.0"?>
    <mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml"
        horizontalAlign="left" verticalAlign="middle"
        verticalGap="0" borderStyle="none" width="100%" height="100%"
     horizontalScrollPolicy="off" verticalScrollPolicy="off" toolTip=""  creationPolicy="all"   
     >

        <mx:Script>
            <![CDATA[
            import mx.controls.TextArea;
            import mx.controls.Text;
            import org.nevis.cairngorm.mod.model.ModelLocator;
            import mx.core.UIComponent;
            import mx.controls.Label;
            import mx.controls.ComboBox;
            import mx.controls.TextInput;
            import utils.Utils;
            import mx.collections.ArrayCollection;
            import mx.controls.Alert;

            [Bindable]
            public var model:ModelLocator=ModelLocator.getInstance();

            [Bindable]
            private var fieldLabelVisible:Boolean = false;

            [Bindable]
            private var textInputVisible:Boolean = false;

            [Bindable]
            private var textAreaVisible:Boolean = false;

            [Bindable]
            private var comboBoxVisible:Boolean = false;

            [Bindable]
            private var mandatoryLabelVisible:Boolean = false;


            public function updata_valor_text(valor:Event):void {
                data.value=valor.currentTarget.text;
            }

            public function updata_valor_combo(valor:Event):void {
                data.value=valor.currentTarget.selectedItem.valuesspecialfieldid
            }

            override public function set data(value:Object):void {
              var i:int;
              var sel:int;

              if (value){   

                super.data = value;

                fieldLabelVisible = true;
                lb.text=value.spe_name;
                lb.toolTip=value.spe_description;
                lb.width=150;  
                lb.name='etiqueta'; 
                lb.styleName='texto-iza';

              } else {
                  fieldLabelVisible = false;
                  textInputVisible = false;
                  textAreaVisible = false;
                  comboBoxVisible = false;
                  mandatoryLabelVisible = false;
              }
            } 

            ]]>
        </mx:Script>

        <mx:Label id="lb" visible="{fieldLabelVisible}" includeInLayout="{fieldLabelVisible}"/> 
        <mx:TextInput id="ti" visible="{textInputVisible}" includeInLayout="{textInputVisible}"/>
        <mx:TextArea id="ta" visible="{textAreaVisible}" includeInLayout="{textAreaVisible}"/>
        <mx:ComboBox id="cb" visible="{comboBoxVisible}" includeInLayout="{comboBoxVisible}"/>
        <mx:Label id="mandatory" visible="{mandatoryLabelVisible}" includeInLayout="{mandatoryLabelVisible}"/>
    </mx:HBox>

I'm not sure, but I think the SDK that i'm using is 2.0.1 Hotfix 3.

Thanks for your help!

I have come to a solution. What happens in my code is that when I try to acces to my mx components (Label, TextInput, TextArea, etc) they are no created yet. To solve this problem, I have used callLater function as follows:

override public function set data(value:Object):void {
              var i:int;
              var sel:int;

              super.data = value;

              callLater(function onceAllCreated():void{              

              if (value){   

                fieldLabelVisible = true;
                lb.text=value.spe_name;
                lb.toolTip=value.spe_description;
                lb.width=150;  
                lb.name='etiqueta'; 
                lb.styleName='texto-iza';

              } else {
                  fieldLabelVisible = false;
                  textInputVisible = false;
                  textAreaVisible = false;
                  comboBoxVisible = false;
                  mandatoryLabelVisible = false;
              }

              });
            }

Hope this helps somebody else!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM