Rotas da Cenas

A Rota é o endereço que será utilizado para acessar uma Cena.

Para que uma cena seja acessível através de uma Rota, é necessário registrá-la através do objeto singleton CrappUIRouteManager.

Uma Rota pode ter parâmetros, e portanto deve ser tipada adequadamente para permitir que o compilador ofereça segurança validando os parâmetros passados ao acessar uma rota. Caso seja uma rota sem parâmetro, é recomendado que ela seja tipada com o objeto Nothing.

A Rota é uma string abstrata do tipo Path<T>, onde T é a estrutura de dados necessária para aplicar todos os parâmetros da rota.

Construindo uma Rota

Uma rota deve seguir o padrão de um caminho HTTP, separando cada uma das partes deste caminho utilizando / (barra). Um parâmetro deve ser definido como uma parte integral de um caminho. Veja exemplos abaixo:


// Definindo uma rota que não possui parâmetros:
var routeWithoutParam:Path<Nothing> = '/my/route/without/parameters';

// As partes de uma rota devem ser codificadas usando o padrão URLEncode,
// garantindo que caracteres especiais sejam devidamente codificados.
var routeShouldBeEncoded:Path<Nothing> = '/my/encoded%20route';

// Para adicionar parâmetros, basta escrever a rota com uma sintaxe especial.
// Veja como ficaria uma rota contendo um parâmetro chamado "value" do tipo String:
var routeWithStringParam:Path<{value:String}> = '/my/route/{value:String}';

// Agora, com um parâmetro do tipo Int:
var routeWithIntParam:Path<{value:Int}> = '/my/route/{value:Int}';

// É possível ter vários parâmetros em uma mesma rota:
var routeWithMutipleParams:Path<{category_id:Int, filter:String}> = '/products/{category_id:Int}/{filter:String}';

Tipos de Parâmetros da Rota

É possível utilizar 4 tipos de parâmetro para ser transmitido em uma rota, permitindo uma grande variedade de opções na sua composição. Definir o tipo adequado tornará o desenvolvimento mais fácil ao recuperar a informação da rota posteriormente.

Tipo
Exemplo
Valores Aceitos

String

{value:String}

Qualquer conteúdo desde que esteja devidamente codificada no padrão URLEncode

Int

{value:Int}

Qualquer número inteiro, positivo ou negativo.

Float

{value:Float}

Qualquer númeiro inteiro ou decimal, positivo ou negativo. Para números decimais, o separador deve ser o .(ponto).

Bool

{value:Bool}

Apenas as opções true ou false, Case-insensitive.

Registrando uma Rota

É necessário uma Cena e uma Rota para efetuar o registro. Ambas devem ter referência ao mesmo tipo para que não ocorra erro de compilação.

// Dê preferência a utilizar typedef para criar para estruturar os parâmetros
typedef RouteParams = {
    var id:Int;
    var name:String;
}

// Ao criar a Cena, ela deve ter a mesma assinatura utilizada na rota
Class MyScene extends CrappUIScene<RouteParamas> {
    override public function setup() {
        super.setup();
        
        trace(this.sceneParams.id);
        trace(this.sceneParams.name);
    }
}

// No local adequado, crie a sua rota contendo a mesma assinatura utilizada pela Cena
var myRoute:Path<RouteParams> = '/my/route/{id:Int}/{name:String}';

// Efetue o registro da rota usando o objeto CrappUIRoute
CrappUIRouteManager.use().register(myRoute, MyScene);

// Para fazer com que sua aplicação navegue até a cena registrada, construa primeiro o caminho...
var buildedPath:String = myRoute.build({id : 10, name : "My Test"}); // -> /my/route/10/My%20Test

// ... e então navegue até ao caminho construído:
CrappUIRouteManager.use().navigate(buildedPath); // -> A cena MyScene será acessada

// Com o exemplo acima, a cena MyScene resultará dois traces:
// trace: 10
// trace: My Test

Não é necessário utilizar o método build() da sua rota, mas utilizando este procedimento você terá a garantia de ter todos os parâmetros aplicados e tratados corretamente, além de ter o alerta do compilador para auxiliar quando houver mudanças na assinatura do seu typedef.

Rotas sem Parâmetros

Quando tiver utilizando Rotas que não não possuem parâmetros, basta utilizar o objeto Nothing.

// A propriedade sceneParams será nulo quando não houver parâmetros na cena
Class MyScene extends CrappUIScene<Nothing> {
    override public function setup() {
        super.setup();
        
        trace(this.sceneParams);
    }
}

// No local adequado, crie a sua rota sem parâmetros
var myRoute:Path<Nothing> = '/my/route';

// Efetue o registro da rota usando o objeto CrappUIRoute
CrappUIRouteManager.use().register(myRoute, MyScene);

// Para fazer com que sua aplicação navegue até a cena registrada, construa primeiro o caminho...
var buildedPath:String = myRoute.build(null); // -> /my/route

// ... e então navegue até ao caminho construído:
CrappUIRouteManager.use().navigate(buildedPath); // -> A cena MyScene será acessada

Atualizado

Isto foi útil?