Criando uma aplicação web com Dart. Parte 2: AngularDart: Básico, roteamento e chamadas HTTP

No artigo anterior, ensinei como criar uma aplicação backend utilizando a linguagem de programação Dart juntamente com o framework Aqueduct, o artigo pode ser encontrado no seguinte link:

Criando uma aplicação web com Dart. Parte 1: Aqueduct: Básico, conexão com banco e autenticação JWT

O Dart é uma linguagem de programação criada dentro da Google em 2011 com o objetivo de substituir o javascript como…

medium.com

Para consumir a api criada, utilizaremos um framework frontend chamado AngularDart, que é uma variação do conhecido framework Angular, só que, ao invés de utilizar o TypeScript, é utilizado o Dart. O resultado da aplicação pode ser vista no GIF a seguir:

Demonstração da aplicação

Aviso: para este tutorial, é recomendado ter um conhecimento prévio sobre frameworks single page application, não entrarei em muitos detalhes de como é o funcionamento de algumas features abordadas.

Setup

Para começar a aplicação, precisaremos clonar o projeto startup do próprio AngularDart, que pode ser encontrado no link a seguir:

angular-examples/quickstart

Welcome to the example app used in the Setup for Development page of Dart for the web. You can run a hosted copy of…

github.com

Precisaremos também, instalar o WebDev, que será utilizado para servir a aplicação, a ferramenta poderá ser instalada com o comando:

pub global activate webdev 2.5.3 Para subir uma aplicação AngularDart em modo de desenvolvedor, utilizamos o seguinte comando dentro da pasta do projeto:

webdev serve No desenvolvimento deste tutorial, encontrei um problema ao rodar a aplicação dizendo que meu compilador estava com bugs, talvez não aconteça com você, mas para resolver isso, foi necessário somente o seguinte comando no terminal para limpar o cache da aplicação:

pub run build_runner clean No arquivo pubspec.yaml, podemos observar que estamos utilizando a versão 6.0.0-alpha, que é a versão mais recente do framework no momento que este artigo foi escrito. Para darmos continuação ao desenvolvimento, iremos adicionar algumas dependências, o arquivo então ficará assim:

  1. angular_router — Dependência do angular utilizado para roteamento.
  2. bulma_scss — Framework CSS que utilizaremos no projeto.
  3. font_awesome — Biblioteca de ícones.
  4. http — Biblioteca para realização de requisições HTTP.
  5. angular_forms — Dependência do angular utilizado para formulários.
  6. sass_builder — Utilizado para uso de arquivos scss.

Estilos

Agora, iremos apagar o conteúdo do arquivo styles.css e substituir com o seguinte conteúdo para deixar a página com uma fonte mais agradável e ocupando 100% da página, não precisaremos de mais nenhum estilo pois estaremos utilizando o framework CSS Bulma.

Para adicionar o Bulma no projeto, criaremos um arquivo app_component.scss dentro da pasta lib com as importações necessárias, o arquivo ficará assim:

Em seguida, precisaremos importar o arquivo scss no app_component.dart, para fazer isso, adicionaremos a seguinte propriedade no @component:

styleUrls: [ ‘app_component.css’,], O arquivo scss será convertido para css automaticamente pela dependência sass_builder.

Roteamento

Para começar a implementação do Angular router, precisaremos injetar o router no app Angular, para fazer isso, edite o arquivo main.dart para ficar da seguinte maneira:

Dentro de lib, criaremos uma pasta chamada components, no qual colocaremos todos os componentes da aplicação. Nossa aplicação terá 4 componentes principais, um componente de barra de navegação que ficará sempre visível a aplicação, um componente de login, outro de cadastro e por fim, um dashboard para listar os ToDo’s.

Então dentro da pasta components, crie as pastas navbar, login, signup e dashboard e dentro de cada pasta, crie dois arquivos, um com extensão dart e outro html com o mesmo nome da pasta, a estrutura do projeto ficará assim:

lib │ └───components │ │ │ └───dashboard │ │ │ dashboard.dart │ │ │ dashboard.html │ │ │ └───login │ │ │ login.dart │ │ │ login.html │ │ │ └───navbar │ │ │ navbar.dart │ │ │ navbar.html
│ └───signup │ │ │ signup.dart │ │ │ signup.html │ │ app_component.dart │ app_component.scss Dentro de cada componente, criaremos um código base só para podermos ver o roteamento funcionando.

Dentro de cada html, você pode colocar um texto somente para diferenciar cada componente caso desejar.

Em seguida, criaremos um arquivo route_paths.dart dentro da pasta lib, este arquivo será onde declararemos nossas rotas:

Por fim, criaremos um arquivo chamado routes.dart dentro da pasta lib que será o arquivo que relacionará as rotas com os componentes do sistema:

Definido as rotas, precisaremos editar o app_component.dart para que o sistema reconheça as rotas criadas e dependendo da url, mostrar o componente desejado, para isso, importaremos as classes de roteamento recém criadas e criaremos um arquivo app_component.html no qual terá a tag router-outlet, que será responsável pela renderização dos componentes dependendo da rota.

app_component.dart:

app_component.html:

E com isso, o roteamento básico da página já estará funcionando, com o comando webdev serve rodando, você já poderá navegar entre as páginas:

http://localhost:8080/#/login http://localhost:8080/#/signup http://localhost:8080/#/dashboard

Navbar

Antes de criar a navbar, precisaremos de uma variável global para a nossa aplicação para verificar se o usuário está ou não autenticado. Também criaremos uma variável chamada baseUrl na qual será utilizada para auxiliar nas requisições http, para isso, criaremos uma pasta utils dentro de lib, e dentro desta pasta, criaremos um arquivo utils.dart:

A navbar do sistema ainda será um componente, porém ele ficará fixo na página independente da rota, para fazer isso, importaremos o componente diretamente no app component junto com a classe Utils:

Logo a seguir, colocaremos o navbar no html do app:

Com isso, já será possível observar que o navbar se mantem presente em todas as rotas do sistema

Finalizando o navbar

Utilizaremos o seguinte html no componente navbar, todo o processo pode ser visto na documentação do bulma. Na linha 11, temos um método necessário para lidar com o menu quando é uma tela de celular, iremos implementar este método no Dart. Os botões da barra de navegação serão diferentes caso o usuário esteja logado ou não, por isso, implementamos na linha 22 e 28 dois IFs para fazer esta verificação, um para se o usuário esta logado e outro caso não esteja.

navbar.dart:

Feito isso, já é para o navbar da aplicação estar funcionando.

Componente de Signup

Para o design da tela de Sign Up, utilizaremos um card, e dentro dele, colocaremos os campos necessários para o cadastro e um botão para cadastro do usuário, também criaremos um modal de confirmação de cadastro.

Componente de Login

O design da tela de login será bem semelhante, dentro de um card, colocaremos dois campos para o usuário digitar os dados de login e um botão para realizar o login, também colocaremos um modal para informar o usuário caso o login informado não exista na base de dados:

Componente Dashboard

Para o componente de dashboard, estaremos utilizando dois cards, um para os botões de ação (adicionar e atualizar), e outro para a listagem de tarefas, perceba que cada tarefa terá seu próprio botão de exclusão e edição. Estaremos utilizando também um modal que será usado tanto para adicionar tarefas quanto para editar tarefas, para fazer isso, o método que chama o modal pode ou não receber uma tarefa como argumento, caso não receba, o modal será utilizado para adição, caso receba, será utilizado para editar a tarefa recebida.

Assim que a página for carregada (ngOnInit), será chamado um método getTodos, no qual será responsável de carregar as tarefas da nossa API Rest.

E com isso, finalizamos nosso frontend feito em AngularDart, espero ter gostado deste tutorial, o repositório do projeto final, tanto a api rest quanto o frontend poderão ser encontrados nos seguintes links:

marcoagpegoraro/todo-app-aqueduct

It’s necessary a postgres database in order for this application to work properly, modify channel.dart ant…

github.com

marcoagpegoraro/todo-app-angular-dart

Contribute to marcoagpegoraro/todo-app-angular-dart development by creating an account on GitHub.

github.com

 

Marco Pegoraro

Hello, my name is Marco, welcome to my personal blog, here i write posts about tecnology, programming, life, tech reviews among other things.


By Marco Pegoraro, 2019-10-27