Просмотр полной версии : продиспатчить кастомный ивент дальше
В одном классе я кидаю кастомное событие
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.
Что делать? Почему ошибка?
Ошибка говорит, что в хендлер onStateChange приходит экземпляр класса Event, а не StateEvent. Вы не кидаете событие типа StateEvent, оттого и возникает RTE, ищите ошибку в первом диспатче.
И да, чтобы пробросить дальше, достаточно написать
menuInfo.addEventListener(StateEvent.CHANGE_STATE, dispatchEvent);
Я перепроверял, точно кидаю свой StateEvent который наследуется от Event. Даже брейк поинтом проверял, приходит тоже StateEvent с теми данными которые я передал..
Приведите более полный код, чтобы не гадать на кофейной гуще.
код ивента, может с ним что-то не так?
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", но пробелов в таких делах лучше избегать
Не, все проще, топикстартер забыл переопределить 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);
}
там выше код, без этого кусочка, а потом я выложил пофикшиную версию на память потомкам :)
вместе с Clone все работает как нужно
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.