I had a custom flex component, ZoomControl:
<mx:VBox>
<mx:Metadata>
[Event(name="zoomChanged", type="ZoomEvent")]
</mx:Metadata>
...
</mx:VBox>>
ZoomControl can throw a "zoomChanged" event, of a custom class ZoomEvent. I then created a Toolbar custom component that contained the ZoomControl:
<mx:VBox>
<mx:Metadata>
[Event(name="zoomChanged", type="ZoomEvent")]
</mx:Metadata>
...
<ZoomControl
zoomChanged="dispatchEvent(event)"
/>
</mx:VBox>>
When the ZoomControl dispatches a ZoomEvent, I want my Toolbar to re-dispatch the event. Seems simple, right? But when the Toolbar calls dispatchEvent, it throws an exception:
TypeError: Error #1034: Type Coercion failed: cannot convert flash.events::Event@19ea2df1 to footnote.imageviewer.events.ZooomEvent.
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.core::UIComponent/dispatchEvent()[E:\dev\3.0.x\frameworks\projects\framework\src\mx\core\UIComponent.as:9051]
at Toolbar/__zoomControl_zoomChanged()...
After some wasted time trying to make sure that it really was a ZoomEvent being passed to dispatchEvent, I finally took time to read the documentation on UIComponent.dispatchEvent:
* If the event is being redispatched, a clone of the event is created automatically.
* After an event is dispatched, itstarget
property cannot be changed,
* so you must create a new copy of the event for redispatching to work.
My problem was that I needed to override the clone method in my ZoomEvent. The dispatchEvent method was calling the base Event.clone(), which was returning an Event, of course. Overriding the clone method to return a ZoomEvent solved the problem.