Muy interesante el tema que colocas.
Yo últimamente estoy trabajando solo con ViewStack en el mxml principal, y dentro de cada vista le coloco un componente personalizado. El proyecto queda muy organizado asi... Y a los cambios entre vista y vista, les coloco unas transiciones muy wow y queda muy bonito todo.
Me ha ido muy bien trabajando así, aunque no es la panacea en metodología de trabajo. Trato de no trabajar con estados a no ser que sea la única solución posible porque he visto que da problemas con los efectos entre transiciones de estado a estado, y se queda trancado en un estado o algo raro por el estilo.
En el mxml trato de solo dejar los componentes personalizados. Así por ejemplo hago un formulario largo de lo que sea, ese lo coloco en una Canvas en un componente personalizado, y llamo a esto componente "Formulario 1" o lo que sea, y luego lo arrastro dentro de una vista del ViewStack pricipal. Y dentro de ese componente escribo las funciones que solo le competen a el. Cuando necesito cambiar la vista lo que hago es.
Código :
MiViewStack.selectedIndex = 2;
Para comunicar todos los componentes personalizados utilizo el patron singleton, y en la clase con el patron singleton coloco todas las variables que necesito que sean globales en el proyecto, para que cada componente personalizado pueda acceder a ellas. El patrón singleton es maravillosamente util para comunicar todos los componentes personalizados.
Lo que hago es crear una clase asi:
Código :
package clases
{
import Lo que se necesite;
[Bindable]
public class Variables
{
private static var variables:Variables;
public static function getInstance():Variables
{
if (variables == null)
{
variables = new Variables();
}
return variables;
}
// De aca para abajo coloco las variables que necesito que sean globales
public var funcioncita :Function;
public var variableGlobalLoqueSea :String = "blablabla";
public var unComponenteLista :List;
// Tambien se pueden imagenes Imagenes
[Embed("imagenes/imagen.png")]
public var imaTitulo:Class;
// También coloco funciones
public function funcionGlobal(lista:String):void
{
LoQueSea();
}
}
}
y luego en todos los componentes creo una instancia asi:
Código :
[Bindable] public var _var:Variables = Variables.getInstance();
De esta manera puedo hacer que cualquier cosa sea global. Variables, Funciones, Eventos y Componentes. Por ejemplo si necesito acceder a una vista que esta en un componente personalizado. En el creationComplete del componente coloco una función asi:
Código :
private function inicio():void
{
unComponenteLista = _var.unComponenteLista;
}
De esta manera hago que esta lista pueda accederse desde cualquier parte del proyecto. Y también se pueden crear eventos que se dispersen por todo el proyecto. Algo como:
Código :
_var.dispatchEvent(new MiClaseEventos(LosEventosMios.EVENTO_WOW));
Esta es la forma en la que he trabajado, aunque debido a la enorme flexibilidad de Flex, uno se va por la fácil y no se están organizado como a uno le gustaría. También me gustaría perfeccionar esta forma de trabajo, con una buena metodología enfocada a flex, pero hasta ahora no la he encontrado. Esta metodología me parece buena para proyectos medianos. Para proyectos moustrosamente grandes, no se si sea practico..
El tema es muy interesante y me gustaría escuchar, experiencias de otros sobre como encaran sus proyectos para así aprender, y depronto copiar buenos trucos.