Il est généralement facile de trouver une solution à l'erreur 1056. Le fait est que dans mon cas, cela n'a rien à voir avec une question de variable publique/privée...

Pour illustrer cela, voici les fichiers que j'ai créé :

  • une classe MySymbol.as héritant de MovieClip
  • un FLA library.fla qui va contenir un clip lié à MySymbol (un clip avec un TextField nommé 'fieldContent')
  • un FLA loader.fla s'occupant de charger library et de créer une instance de MySymbol

Ci-dessous, le code de la classe, tout ce qu'il y a de plus basique :

package
{
	import flash.display.*;
	import flash.text.*;
 
	public class MySymbol extends MovieClip
	{
		public function MySymbol():void
		{
			trace("MySymbol created");
		}
	}
}

Le fichier library.fla ne contient que le MovieClip lié à MySymbol. Et le fichier loader.fla a le code suivant en première frame :

var ldr:Loader = new Loader();
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
 
var frt:URLRequest = new URLRequest("library.swf");
var ctx:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
ldr.load(frt, ctx);
 
function onComplete(evt:Event):void
{
	var f:MySymbol = new MySymbol();
	addChild(f);
}

A noter qu'il faut charger le fichier library.swf dans le contexte courant afin de pouvoir utiliser le MovieClip lié à MySymbol par la suite dans d'autres fichiers chargés. Mais ici, cela n'est (pour l'instant) pas très important.

Il suffit d'exécuter le fichier loader.fla pour se retrouver avec cette erreur :

ReferenceError: Error #1056: Cannot create property fieldContent on MySymbol.
	at flash.display::Sprite/constructChildren()
	at flash.display::Sprite()
	at flash.display::MovieClip()
	at MySymbol()
	at loader_fla::MainTimeline/onComplete()

Visiblement, flash n'arrive pas à créer le TextField contenu dans le clip MySymbol... ce qui ne veut absolument rien dire, car au premier abord il n'y a aucun conflit de nom ou de variable privée pouvant provoquer cela.

En fait, ce qui se passe est un bête problème de compilation de classe : en faisant un new MySymbol(), flash va compiler la classe MySymbol dans loader.fla (et qui n'a donc aucun clip lié). Ensuite, lorsque library.swf est chargé, tout d'un coup un symbole est lié à cette classe ce qui fait que flash s'emmêle complètement les pinceaux...

Pour contourner cela, il est possible d'utiliser le code suivant pour éviter que MySymbol ne soit compilé :

var ldr:Loader = new Loader();
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
 
var frt:URLRequest = new URLRequest("library.swf");
var ctx:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
ldr.load(frt, ctx);
 
function onComplete(evt:Event):void
{
	var mySymbol:Class = getDefinitionByName("MySymbol") as Class
	addChild(new mySymbol());
}

Dans cet exemple, l'utilisation d'un LoaderContext spécifique prend toute son importance ! Si celui-ci n'est pas utilisé, la classe MySymbol ne sera pas trouvée au runtime et il en résultera une erreur de ce type :

ReferenceError: Error #1065: Variable MySymbol is not defined.
	at global/flash.utils::getDefinitionByName()
	at loader_fla::MainTimeline/onComplete()

Le dernier souci est que dans le code ci-dessus, il n'est plus possible d'utiliser le typage fort pour créer une instance de MySymbol. Pour solutionner ce dernier point, il suffit de créer un troisième fichier qui lui va s'occuper de ça ! Au final, le code dans loader.fla est le suivant :

var ldr:Loader = new Loader();
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
 
var frt:URLRequest = new URLRequest("library.swf");
var ctx:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
ldr.load(frt, ctx);
 
function onComplete(evt:Event):void
{
	var usr:Loader = new Loader();
	usr.load(new URLRequest("libraryUser.swf"));
	addChild(usr);
}

et le fichier libraryUser.fla contient simplement :

var f:MySymbol = new MySymbol();
addChild(f);

Il est intéressant de noter qu'il n'est pas nécessaire de spécifier un LoaderContext pour libraryUser.swf car celui-ci va automatiquement être chargé das un ApplicationDomain enfant de loader.swf, ce qui lui permet d'utiliser le clip lié à la classe MySymbol !

En conclusion, lors d'utilisation de symboles liés au travers de différents fichiers il est toujours préférable d'avoir un fichier parent qui va s'occuper de charger les différentes librairies dans le bon contexte. Pour ceux qui utilisent Masapi, c'est un mécanisme qui est automatiquement intégré lors du chargement de fichiers SWF.

Pour ceux qu veulent approfondir le sujet, j'ai mis en annexe les fichiers servant à l'exemple ci-dessus !