FLEX:当我调用它的方法时,自定义组件仍然是一个 Null 对象

Posted

技术标签:

【中文标题】FLEX:当我调用它的方法时,自定义组件仍然是一个 Null 对象【英文标题】:FLEX: the custom component is still a Null Object when I invoke its method 【发布时间】:2011-02-09 10:27:48 【问题描述】:

我在 Flex 中创建了一个自定义组件,并使用 actionscript 从主应用程序创建了它。随后我调用它的“setName”方法来传递一个字符串。

我收到以下运行时错误(仅在我使用 setName 方法时发生):

TypeError: Error #1009: Cannot access a property or method of a null object reference.

我想我明白了,因为我在组件完全创建之前从主应用程序调用了 newUser.setName 方法。

我怎样才能让actionscript“等待”直到创建组件来调用该方法?我应该在等待它的主应用程序中创建一个事件侦听器吗?如果可能的话,我宁愿避免它。

代码如下:

主应用

...
newUser = new userComp();
//newUser.setName("name");

组件:

<?xml version="1.0" encoding="utf-8"?>
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"   >

<mx:Script>
    <![CDATA[


        public function setName(name:String):void 
            username.text = name;
        

       public function setTags(Tags:String):void 

        

    ]]>
    </mx:Script>

    <mx:HBox id="tagsPopup" visible="false">
        <mx:LinkButton label="Tag1" />
        <mx:LinkButton label="Tag2" />
        <mx:LinkButton label="Tag3" />      
    </mx:HBox>

    <mx:Image source="@Embed(source='../icons/userIcon.png')"/>
    <mx:Label id="username" text="Nickname" visible="false"/>

</mx:VBox>

谢谢

【问题讨论】:

【参考方案1】:

我自己也遇到了这个问题,发现问题的另一个方面,creationPolicy 属性:

http://livedocs.adobe.com/flex/3/html/help.html?content=layoutperformance_05.html

如果您在自定义组件中设置 creationPolicy="all",则在创建时,它将创建其所有子组件。否则,它会延迟到最后一分钟。它使创建速度变慢,但如果您需要立即将其全部用于编码,这允许您这样做,而无需绕过它。这为我解决了问题,希望对您有所帮助。

【讨论】:

【参考方案2】:

您收到错误消息是因为在您调用 setName 函数时,ID 为“用户名”的标签组件尚未初始化。

您可以在 UserComp 中创建一个属性,并将 Label 的 text 属性绑定到它。在您的 setName 函数中,您将值分配给刚刚创建的属性。当 Label 组件创建时,它将使用属性中的值显示在屏幕上。

<?xml version="1.0" encoding="utf-8"?>
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"   >

<mx:Script>
    <![CDATA[
        [Bindable]
        private var _name;
        public function setName(name:String):void 
            _name=name;
        

       public function setTags(Tags:String):void 

        

    ]]>
    </mx:Script>

    <mx:HBox id="tagsPopup" visible="false">
        <mx:LinkButton label="Tag1" />
        <mx:LinkButton label="Tag2" />
        <mx:LinkButton label="Tag3" />      
    </mx:HBox>

    <mx:Image source="@Embed(source='../icons/userIcon.png')"/>
    <mx:Label id="username" text="_name" visible="false"/>

</mx:VBox>

【讨论】:

【参考方案3】:

你可以试试creationcompleted方法。类似于以下内容:

<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml"   creationComplete="creationCompletedHandler(event)">

并在脚本中添加以下内容:

import mx.events.FlexEvent;

private function creationCompletedHandler(event:FlexEvent):void

   //Your code

【讨论】:

我实际上需要从主应用程序调用 setName 函数,而不是从组件调用。我复制的第一部分代码来自主应用程序,我从那里调用方法。

以上是关于FLEX:当我调用它的方法时,自定义组件仍然是一个 Null 对象的主要内容,如果未能解决你的问题,请参考以下文章

Flex 自定义皮肤不调出 IOS 软键盘

flex 自定义组件

如何在 Flex 中获取自定义组件的句柄?

AS3/Flex 自定义 TextInput 组件填充

Flutter自定义绘制组件

自定义VIew方法