Как я могу использовать класс Event от Starling и Flash в одном классе

Работая со Starling, я столкнулся с этой проблемой. Иногда важно использовать событие Flash.

import starling.events.Event;
import flash.events.Event ;
var _myFile_Fr:FileReference = new FileReference();
_myFile_Fr.addEventListener(Event.COMPLETE, onFileLoaded);
_myFile_Fr.load();
function onFileLoaded(event:Event ):void
{
  trace( event.target.data ) // <<<< compiler error:       


}

Доступ к возможно неопределенным данным свойства через ссылку со статическим типом starling.events:EventDispatcher

Я пытался использовать полную спецификацию

function someEventHandler(event:flash.events.Event ):void
{
  ....
}

Также так:

_myFile_Fr.addEventListener(flash.events.Event.COMPLETE, onFileLoaded);
_myFile_Fr.load();

function onFileLoaded(e:Event ):void 
{
    trace( e.target.data );
}       

Но вышеупомянутое не работает, и показывает ошибку времени компиляции.

доступ к неопределенному свойству Flash

Тогда какой выход?

Доступ к возможно неопределенным данным свойства через ссылку со статическим типом starling.events:EventDispatcher. С flash.events.Event все работает нормально.

4 ответа

Проблема вызвана тем, что компилятор считает, что нужное вам событие - starling.events.Event. События Starling имеют атрибут target но это (в отличие от событий flash) имеет определенный тип EventDispatcher где флеш просто универсальный Object, Поэтому, когда вы ищете event.target.data вы пытаетесь найти атрибут data на скромный объект EventDispatcher. В классе EventDispatcher отсутствует атрибут данных, поэтому он выдает эту ошибку.
Вы должны быть осторожны, что, когда у вас есть и starling.events.Event, и flash.events.Event, вам нужно будет указать, какой именно вы ожидаете (используя его полное имя).

public function onLoad(event:flash.events.Event):void

или же

public function onLoad(event:starling.events.Event):void

но нет

public function onLoad(event:Event):void

если только вы не импортировали события flash или starling, но не оба одновременно.

Единственный способ, который я нашел, - нигде не использовать имя класса Event. Итак, что сработало для меня это:

import starling.events.Event;

var _myFile_Fr:FileReference = new FileReference();
_myFile_Fr.addEventListener(Event.COMPLETE, onFileLoaded);
_myFile_Fr.load();
function onFileLoaded(event):void //<< Don't use class name specification
{
  trace( event.target.data )  


} 

доступ к неопределенному свойству Flash

Вы правы, что вам нужно использовать полное имя класса flash.events.EventНо я подозреваю, что вы сделали опечатку. Обратите внимание, что ошибка говорит Flash где первая буква заглавная. ActionScript чувствителен к регистру, поэтому Flash.events.Event не будет работать. Это должно быть flash.events.Event где flash это все строчные.

import starling.events.Event;
import flash.events.Event;
var _myFile_Fr:FileReference = new FileReference();
_myFile_Fr.addEventListener(flash.events.Event.COMPLETE, onFileLoaded);
_myFile_Fr.load();
function onFileLoaded(event:flash.events.Event):void
{
    //see below for changes
}

Доступ к возможно неопределенным данным свойства через ссылку со статическим типом starling.events:EventDispatcher

Это означает именно то, что говорится. target свойство события набирается как EventDispatcher, Если вы знаете, что это что-то более конкретное, вам нужно разыграть его следующим образом:

var file:FileReference = FileReference(event.target);
trace( file.data );

От Старлинга Дока

Объекты события передаются в качестве параметров слушателям событий, когда происходит событие. Это версия Starling класса Flash Event.

этот класс делает все это flash.events.Event делал раньше со своими дополнительными опциями. В чем было бы преимущество использования импорта flash.events.Event в вашем случае?

тем не мение

addEventListener(flash.events.Event.ADDED, handler);
function handler(e:flash.events.Event) {}

не вызывает никаких ошибок в обычном порядке.

Тоже из Старлинга

В этом случае вы можете создать подкласс "Событие" и добавить свойства со всей необходимой вам информацией.

Другие вопросы по тегам