通过AS3中的参数访问FlashVar的问题

时间:2020-03-06 14:29:39  来源:igfitidea点击:

当我尝试访问AS3类中的flashVars时,我不断收到编译器错误。

这是代码的剥离版本:

package myPackage {
 import flash.display.Loader;
 import flash.display.LoaderInfo;
 import flash.display.Sprite;
  public class myClass {
    public function CTrafficHandler() {
        var myVar:String = LoaderInfo(this.root.loaderInfo).parameters.myFvar;}}}

我得到一个编译错误:

1119:通过静态类型为source:myClass的引用访问可能未定义的属性根。

当我将班级行更改为

public class myClass extends Sprite {

我没有得到编译器错误,但是我确实在输出窗口中得到了这个:

TypeError:错误#1009:无法访问空对象引用的属性或者方法。

通过调试器(如建议的那样),我可以看到this.root为空。

我怎么解决这个问题?

解决方案

我认为我们应该从Sprite扩展,但是一定要首先对其进行初始化,并且也许要登台了。尝试启用调试,并查看异常报告所说的确切为null的内容。

我发现了问题所在。所讨论的类不是项目中使用的主要类,而是次要类。

我已将代码移至主类以获取参数,并在获得参数后将其发送给类构造函数。

或者,我们可以尝试使用mx.core.Application.application.parameters对象。

从mx.core.Application的LiveDocs页面:

application : Object
  
[static] [read-only] A reference to the top-level application.
  

  
parameters : Object
  
[read-only] The parameters property returns an Object containing name-value pairs representing the parameters provided to this Application.
  

  
There are two sources of parameters: the query string of the Application's URL, and the value of the FlashVars HTML parameter (this affects only the main Application).

问题确实确实是我们试图从非显示对象或者从文档类外部访问此信息。如果要访问根目录或者阶段,则必须首先将希望访问根目录或者舞台的对象添加到显示列表中。

我经常将flashvars用于整个项目中经常使用的变量。变量,例如国家/地区和语言。我发现在这种情况下,最好是在文档类中捕获这些参数,并使用所述参数作为值来创建公共变量。这将使_global样式可以访问这些变量。综上所述,我们确实应该谨慎使用全局变量,尤其是在进行协作项目时。

问题是,在我们尝试访问Flash变量时,尚未将DisplayObject添加到DisplayList中。因此,根显示对象根据对象为空。

我们可以使用以下方法确保DisplayObject处于舞台上:

package
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class MySprite extends Sprite
    {
        // constructor
        public function MySprite()
        {
            super();
            addEventListener( Event.ADDED_TO_STAGE, onAddedToStage, false, 0, true );
        }

        private function onAddedToStage( event:Event ):void
        {
            removeEventListener( Event.ADDED_TO_STAGE, onAddedToStage );

            var paramList:Object = LoaderInfo( this.root.loaderInfo ).parameters;
            var myParam:String = paramList["myParam"];
        }
    }
}

`