Question

Je continue à avoir des erreurs de compilation lorsque j'essaie d'accéder à flashVars dans une classe AS3.

Voici une version allégée du code:

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;}}}

Et j'obtiens une erreur de compilation:

1119: Accès à la racine de la propriété éventuellement non définie via une référence de type statique source: myClass.

Lorsque je remplace la ligne de la classe par

public class myClass extends Sprite {

Je ne reçois pas d'erreur de compilation, mais je l'obtiens dans la fenêtre de sortie:

TypeError: Erreur n ° 1009: impossible d'accéder à une propriété ou à une méthode d'une référence d'objet null.

Via le débogueur (comme suggéré), je peux voir que this.root est nul.

Comment puis-je résoudre ce problème?

Était-ce utile?

La solution 2

J'ai trouvé quel était le problème. La classe en question n'était pas la classe principale utilisée dans le projet, mais une classe secondaire.

J'ai déplacé le code dans la classe principale pour obtenir les paramètres et, après les avoir obtenus, je les ai envoyés à la fonction constructeur de la classe.

Autres conseils

Votre problème est que votre objet DisplayObject n'a pas été ajouté à la liste DisplayList, au moment où vous essayez d'accéder à des vars flash. L'objet d'affichage racine est donc nul, selon votre objet.

Vous pouvez vous assurer que votre objet DisplayObject est sur la scène en utilisant les éléments suivants:

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"];
        }
    }
}

`

Le problème était en effet que vous essayiez d'accéder à ces informations à partir d'un objet non-affiché ou de l'extérieur de la classe de document. Si vous souhaitez accéder à la racine ou à la scène, l'objet qui souhaite y accéder doit d'abord être ajouté à la liste d'affichage.

J'utilise souvent des flashvars pour les variables souvent utilisées tout au long du projet. Variables comme pays et langue. Je trouve que dans ce cas, il est préférable d’attraper ces paramètres dans la classe de document et de créer des variables publiques avec ces paramètres comme valeurs. Cela donnera à _global un accès à ces variables. Cela dit, vous devez vraiment utiliser les variables globales avec parcimonie, en particulier lorsque vous travaillez sur des projets collaboratifs.

Vous pouvez également utiliser l'objet mx.core.Application.application.parameters .

À partir de la page LiveDocs de mx.core. Application :

  

application : objet   
[statique] [lecture seule] Référence à l'application de niveau supérieur.   
  
paramètres : objet   
[lecture seule] La propriété parameters renvoie un objet contenant des paires nom-valeur représentant les paramètres fournis à cette application.   
  
Il existe deux sources de paramètres: la chaîne de requête de l'URL de l'application et la valeur du paramètre HTML FlashVars (cela n'affecte que l'application principale).

Je pense que vous devriez sortir de Sprite, mais assurez-vous de l'initialiser d'abord et peut-être de le mettre en scène. Essayez d'activer le débogage et voyez ce qui est exactement null comme l'indique le rapport d'exception.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top