Episódio 31 - Controle de Fluxo Visual com JSON e UI Dinâmica
No episódio anterior, vimos como representar uma lógica declarativa de agendamento baseada em JSON. Agora, vamos dar um passo à frente e integrar essa lógica com uma interface gráfica reativa, onde a própria UI muda com base nas condições definidas no JSON.
Objetivo
Permitir que o fluxo visual da aplicação (como exibir/ocultar componentes, mudar de tela, mostrar mensagens, etc.) seja definido por meio de estruturas JSON carregadas em tempo de execução, eliminando a necessidade de recompilar o aplicativo.
Exemplo de JSON de Controle Visual
{
"acao": "ValidarEmail",
"parametros": {
"email": "{{input.email}}"
},
"se_valido": [
{ "acao": "MostrarMensagem", "mensagem": "Email válido!" },
{ "acao": "IrPara", "tela": "CadastroProximoPasso" }
],
"se_invalido": [
{ "acao": "MostrarErro", "mensagem": "Email inválido." }
]
}
Conceitos Aplicados
- Separar lógica de apresentação: O backend (ou mecanismo de interpretação) decide o que deve acontecer, e a interface apenas executa.
- Interação reversível: O usuário pode navegar entre passos sem que seja preciso reprocessar tudo do início.
- Composição declarativa: A sequência de interações pode ser descrita como uma lista de ações em JSON.
Benefícios
- Rápida adaptação da interface sem reimplantação
- Customização específica por cliente ou contexto
- Redução de acoplamento entre regras de negócio e interface
Integração com TSafeThread + TTaskChain
Esse controle de fluxo pode ser orquestrado com TSafeThread e TTaskChain para que cada ação (validar, mostrar, navegar) seja tratada como uma etapa assíncrona segura.
TaskChain.AddTask('Validar Email',
procedure(TaskName: string; OnSuccess: TProc; OnError: TErrorCallback)
begin
ValidarEmailJSON(ArquivoOuString, OnSuccess, OnError);
end);
Conclusão
Com esse modelo, criamos um "designer de lógica visual" sem abrir o Delphi. A interface pode evoluir junto com o negócio, sem que para isso precisemos alterar código-fonte diretamente.
No próximo episódio, vamos transformar essa estrutura em um mapeador visual com suporte a condicionais, listas e widgets reutilizáveis.