PDA

Просмотр полной версии : продиспатчить кастомный ивент дальше


Quadro9
04.10.2015, 23:51
В одном классе я кидаю кастомное событие
dispatchEvent(new StateEvent(StateEvent.CHANGE_STATE, StateStack.PLAY_STATE));

В другом классе я его ловлю и кидаю дальше
private function init():void {
menuInfo.addEventListener(StateEvent.CHANGE_STATE, onStateChange);
}

private function onStateChange(event:StateEvent):void {
dispatchEvent(event); // тут ошибка..
}

Но вываливается ошибка
TypeError: Error #1034: Type Coercion failed: cannot convert flash.events::Event@544f511 to States.Events.StateEvent.

Что делать? Почему ошибка?

КорДум
05.10.2015, 00:20
Ошибка говорит, что в хендлер onStateChange приходит экземпляр класса Event, а не StateEvent. Вы не кидаете событие типа StateEvent, оттого и возникает RTE, ищите ошибку в первом диспатче.
И да, чтобы пробросить дальше, достаточно написать
menuInfo.addEventListener(StateEvent.CHANGE_STATE, dispatchEvent);

Quadro9
05.10.2015, 00:26
Я перепроверял, точно кидаю свой StateEvent который наследуется от Event. Даже брейк поинтом проверял, приходит тоже StateEvent с теми данными которые я передал..

КорДум
05.10.2015, 00:27
Приведите более полный код, чтобы не гадать на кофейной гуще.

Quadro9
05.10.2015, 00:41
код ивента, может с ним что-то не так?
package States.Events {
import flash.events.Event;

public class StateEvent extends Event {

public static const CHANGE_STATE:String = "change state";

private var _newState:int;

public function StateEvent(type:String, newState:int, bubbles:Boolean = false, cancelable:Boolean = false) {
super(type, bubbles, cancelable);
_newState = newState;
}

public function get newState():int {
return _newState;
}
}
}

тут я кидаю событие
override public function update(delta:Number):void {
if (_model.isMouseDown) {
dispatchEvent(new StateEvent(StateEvent.CHANGE_STATE, StateStack.PLAY_STATE));
}
}

Добавлено через 10 минут
Все я понял, надо в ивенте еще дописать клон
новый код ивента

package States.Events {
import flash.events.Event;

public class StateEvent extends Event {

public static const CHANGE_STATE:String = "change state";

private var _newState:int;

public function StateEvent(type:String, newState:int, bubbles:Boolean = false, cancelable:Boolean = false) {
super(type, bubbles, cancelable);
_newState = newState;
}

public function get newState():int {
return _newState;
}

// always create a clone() method for events in case you want to redispatch them.
public override function clone():Event
{
return new StateEvent(type, newState, bubbles, cancelable);
}
}
}

caseyryan
05.10.2015, 06:41
Больше ничему не добавлен этот же обработчик? Вполне возможно, что он дергается по какому-то другому событию.
Я бы ради эксперимента попробовал еще явным образом привести к типу
dispatchEvent(event as StateEvent);
Если и в этом случае отвалится, значит проблема вызвана чем-то другим. А в этом месте падает как следствие

п.с.
Вряд ли конечно проблема в "change state", но пробелов в таких делах лучше избегать

КорДум
05.10.2015, 11:01
Не, все проще, топикстартер забыл переопределить clone )

caseyryan
05.10.2015, 12:34
Как это забыл то?
А это что?
// always create a clone() method for events in case you want to redispatch them.
public override function clone():Event
{
return new StateEvent(type, newState, bubbles, cancelable);
}

Quadro9
05.10.2015, 12:50
там выше код, без этого кусочка, а потом я выложил пофикшиную версию на память потомкам :)
вместе с Clone все работает как нужно