読者です 読者をやめる 読者になる 読者になる

StateでincludeInを使っているときは生成タイミングを意識する

AIR

Flex4からはStateが簡単に書けるようになったのもあって、よく使っているのではないでしょうか。
で、状態に応じてボタンの表示、非表示を切り替えたりといった事をよくStateで行うのではないかと思います。
この際にincludeInを使う方法と、個別のプロパティにstateを記述する方法がありますが、コンポーネントの生成タイミングが変わったりしますので、注意が必要です。


具体例。
何かデータを新規保存する際は、まだデータがないので、削除ボタンを表示させず、データが既にあり、修正、削除を行える状態時には削除ボタンを表示する、というような場合です。
設定に合わせて、削除ボタンの文字色を変更も親コンポーネントが生成されたタイミングで行います。

includeIn版

	<fx:Script>
		<![CDATA[
			import mx.events.FlexEvent;

//省略....................................................................

			protected function component_creationCompleteHandler(event:FlexEvent):void {
				if(doColorSetting=="black"){
					deleteButton.setStyle("color",0x000000);
				}else {
					deleteButton.setStyle("color",0xFFFFFF);
				}
				this.currentState="newSetting";
			}

//省略.....................................................................
		]]>
	</fx:Script>
	<s:states>
		<s:State name="newSetting"/>
		<s:State name="modify"/>
	</s:states>
//省略.....................................................................
	<s:Button id="saveButton"
			  label.newSetting="作成"
			  label.modify="修正"/>
	<s:Button id="deleteButton"
			  includeIn="modify"
			  label="削除"/>
//省略.....................................................................

includeInで制御している場合、親コンポーネントのcreationCompleteの段階では、 stateのmodifyに切り替わっていませんので、 deleteButtonコンポーネントは生成されていません。したがって、setStyleの所で、deleteButtonがnullなのでエラーになります。


プロパティにstateを記述した場合

	<fx:Script>
		<![CDATA[
			import mx.events.FlexEvent;

//省略....................................................................

			protected function component_creationCompleteHandler(event:FlexEvent):void {
				if(doColorSetting=="black"){
					deleteButton.setStyle("color",0x000000);
				}else {
					deleteButton.setStyle("color",0xFFFFFF);
				}
				this.currentState="newSetting";
			}

//省略.....................................................................
		]]>
	</fx:Script>
	<s:states>
		<s:State name="newSetting"/>
		<s:State name="modify"/>
	</s:states>
//省略.....................................................................
	<s:Button id="saveButton"
			  label.newSetting="作成"
			  label.modify="修正"/>
	<s:Button id="deleteButton"
			  visible.newSetting="false"
			  visible.modify="true"
			  label="削除"/>
//省略.....................................................................

この場合はvisibleにstateを記述して制御しています。
deleteButtonは親コンポーネントのcreationCompleteのタイミングでは既に生成されていますのでエラーにはなりません。