Как вы и предполагали, это связано с жизненным циклом компонента Flex.Взгляните на исходный код UIComponent:
mx_internal function childAdded(child:DisplayObject):void {
...
UIComponent(child).initialize();
...
}
Этот метод вызывается после добавления дочернего компонента в родительский компонент и, следовательно, в список отображения.Как видите, только тогда будет инициализирован дочерний компонент.Это означает, что ничего не будет нарисовано до тех пор, пока компонент не будет добавлен в список отображения.
Теперь вы можете подумать: «Хорошо, давайте тогда просто вызовем initialize () явно».Это тоже не сработает.Посмотрите на функцию, которая инициирует рендеринг:
public function validateDisplayList():void
{
if (invalidateDisplayListFlag)
{
var sm:ISystemManager = parent as ISystemManager;
Это относится к родительскому DisplayObject, который является нулевым, так как компонент не был добавлен в список отображения.И есть другие вещи после этого, которые потерпят неудачу, потому что компонент не был создан должным образом.Платформа Flex никогда не вызовет этот метод, если компонент отсутствует в списке отображения, и если вы вызовете его явно, вы получите ошибки времени выполнения.
Вывод: , если вы хотитеНарисуйте компоненты Flex в виде растрового изображения, вам придется добавить их в список отображения.Или сделайте так, как предложил @divillysausages, и используйте чистую альтернативу ActionScript.
Чтобы быть уверенным, что компонент был добавлен в список отображения и полностью отображен, вы должны прослушать событие FlexEvent.CREATION_COMPLETE
(я считаю, предложение пропуститьнекоторые кадры - плохая практика; см. комментарии ниже).
var label:Label = new Label();
label.text = "hello";
label.addEventListener(FlexEvent.CREATION_COMPLETE, nowDrawTheBitmap);
addElement(label);