Я продолжаю получать ошибки компилятора, когда пытаюсь получить доступ к flashVars в классе AS3.
Вот урезанная версия кода:
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: Доступ к возможно неопределенному корню свойства через ссылку с источником статического типа: myClass.
Когда я меняю строку класса на
public class myClass extends Sprite {
Я не получаю сообщение об ошибке компилятора, но получаю это в окне вывода:
TypeError: ошибка № 1009: невозможно получить доступ к свойству или методу ссылки на нулевой объект.
Через отладчик (как предлагается) я вижу, что this.root имеет значение null.
Как я могу решить эту проблему?
![[UX] Категории и настройки внешнего вида Flash-сообщений](https://i.imgur.com/5LZljB8b.jpeg)
Я думаю, вам следует расширить Sprite, но сначала обязательно инициализируйте его и, возможно, примените к сцене. Попробуйте включить отладку и посмотрите, что именно является нулевым, как говорится в отчете об исключении.
Я нашел, в чем проблема. Рассматриваемый класс не был основным классом, используемым в проекте, а скорее второстепенным.
Я переместил код в основной класс, чтобы получить параметры, и после того, как я их получил, я отправил их в функцию конструктора класса.
В качестве альтернативы вы можете попробовать использовать объект mx.core.Application.application.parameters.
На странице LiveDocs для mx.core.Application:
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. При этом вам действительно следует экономно использовать глобальные переменные, особенно при работе над совместными проектами.
Ваша проблема в том, что ваш DisplayObject не был добавлен в DisplayList в момент, когда вы пытаетесь получить доступ к флэш-варам. Следовательно, в соответствии с вашим объектом корневой экранный объект имеет значение NULL.
Вы можете убедиться, что ваш 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"];
}
}
}
`
Обратите внимание: поскольку класс Application является частью пакетов mx, *, это работает, только если вы используете Flex.