Já compreendemos o nosso projeto e qual desafio teremos para implementar nossas funcionalidades. Qual é o próximo passo? Começar a implementar essa conexão com o servidor.
Primeiro, precisamos instalar o DIO, o pacote que vai fazer essa comunicação com a API. E a segunda parte é criar um ambiente na nossa tela, no nosso Listin, que possa fazer essa comunicação com o servidor. Vamos aproveitar esse vídeo para fazer isso.
Então, já no nosso VSCode, vamos puxar o terminal para cima e vamos escrever flutter pub add dio. Vamos dar um Enter. Não tem problema esses pequenos erros que aparecem no terminal do VSCode. Mas, rodando esse código, você vai ver que ele já vai baixar a dependência, rodar o flutter pub get.
Mais uma vez, aquele detalhe com o versionamento. Vamos abrir nosso pubspec.yml no explorador e você vai ver que ele instalou o DIO na versão 5.4.1. É o ideal que você siga a nossa versão também.
Fechando o pubspec.yml, precisamos criar algum lugar nessa tela inicial para poder fazer a comunicação com o servidor.
Para fazer isso, vamos primeiro encontrar essa tela. Sabemos que ela está dentro da pasta listins. Vamos fechar a core, vamos abrir a listins > screens > home_screen.dart.
Vamos fechar o nosso explorador e um lugar que pode ficar bem legal de colocar é na própria appBar. Então, na linha 40, dentro da nossa appBar, vamos adicionar um actions. Esse actions nos permite colocar alguns botões ali no canto direito da appBar. Então, o que vamos adicionar é um PopupMenuButton, por enquanto. Porque é o botão que vai chamar esse Popup com vários outros botões.
O que precisamos passar aqui? Além desse itemBuilder que ele está pedindo, no começo desses parênteses vamos passar também um icon. Porque queremos definir nosso icon, queremos que ele use o padrão. E esse icon vai ser Icon(Icons.cloud), que vai dar uma ideia de nuvem, de comunicação com a nuvem.
No lugar desse itemBuilder que está dando erro, vamos apagar e vamos dar um Ctrl + Espaço. Ele já vai nos sugerir como ele quer essa função, não é? Então, vamos escolher a segunda opção (context) {}. E aqui podemos retornar uma lista.
Ele espera uma lista de quê? Ele espera uma lista de botões, de botões específicos, de itens. Então, esses itens vão ser PopupMenuItem.
Precisamos definir algumas coisas para esse PopupMenuItem. A primeira coisa é o valor dele. Então, vamos passar o valor, vamos chamar de save, por enquanto.
Cada valor vai definir o que acontece quando clicamos em um desses menus. Vamos definir o valor como SAVE. Você pode considerar isso como uma chave.
E o filho vai ser listTile. Porque queremos que ele tenha aquele comportamento de ícone, de um título. Falando nisso, vamos definir o ícone como leading. Vamos passar aqui um ícone, Icons.upload. E o título vai ser algo como Text("Salvar na nuvem"). Vamos colocar umas vírgulas para melhorar a visualização.
Isso cria um botão na appBar do emulador que pode ser acessando clicando no botão de ícone da nuvem na lateral superior direita. A ideia é fazer uma lista de botões, cada um com uma funcionalidade.
O código para os outros botões será muito parecido. Então vamos copiar toda a const PopupMenuItem e o que ela tem entre colchetes. Colaremos esse código duas vezes para editá-lo em seguida.
No segundo const PopupMenuItem, mudaremos o "SAVE" para "SYNC", de Icons.upload, mudaremos para Icons.download, para pegar o símbolo de download. Além disso, o texto "Salvar na nuvem" será substituído por "Sincronizar na nuvem".
Assim, um sobe para a nuvem e o outro sincroniza com as informações que estão na nuvem. Por fim, na linha 61, no terceiro PopupMenuItem colado, substituiremos o "SAVE" por "CLEAR", o Icons.upload por Icons.delete e o título será "Remover dados da nuvem".
Afinal, sempre que salvamos dados de pessoas usuárias na nuvem, é sempre muito importante permitir que elas removam, se assim desejarem, por uma questão de proteção de dados.
itemBuilder: (context) {
return [
const PopupMenuItem(
value: "SAVE",
child: ListTile(
leading: Icon(Icons.upload),
title: Text("Salvar na nuvem"),
),
),
const PopupMenuItem(
value: "SYNC",
child: ListTile(
leading: Icon(Icons.download),
title: Text("Sincronizar da nuvem"),
),
),
const PopupMenuItem(
value: "CLEAR",
child: ListTile(
leading: Icon(Icons.delete),
title: Text("Remover dados da nuvem"),
),
),
];
},
Definidos os valores desses PopupMenuItem, precisamos fazer com que o PopupMenuButton esteja preparado para reagir quando um desses for clicado.
Para fazer isso, abriremos uma nova linha depois do icon, pressionaremos Ctrl + Espaço e procuraremos por onSelected. Ele nos dá uma função que tem um valor, que é justamente o valor selecionado, ou seja, clicado.
Então, já podemos testar se o valor for igual a "SAVE", faremos alguma coisa. Usamos o Alt + Shift + Seta para baixo para duplicar essa linha duas vezes. Se for "SYNC" será outra, e se for "CLEAR", outra.
E quais são as coisas que queremos fazer? Queremos chamar métodos. Não precisamos nos preocupar em implementá-los ainda, mas queremos chamá-los. Vamos ao menos declará-los no fim do código, depois de tudo o que já existe.
Criaremos um método chamado saveOnServer(), vamos defini-lo como assíncrono (async), pois as alterações serão todas assíncronas. Criaremos também um syncWithServer(), ou seja, sincronizar com o server. Por último, criaremos também um clearServerData. Todos não fazem nada por enquanto, mas já montamos a estrutura da tela.
saveOnServer() async {}
syncWithServer() async {}
clearServerData() async {}
Voltando para as condicionais, quando for clicado em "SAVE", chamamos saveOnServer(), quando clicarmos em "SYNC", chamamos syncWithServer() e quando clicarmos em "CLEAR", chamamos clearServerData().
PopupMenuButton(
icon: const Icon(Icons.cloud),
onSelected: (value) {
if (value == "SAVE") {
saveOnServer();
}
if (value == "SYNC") {
syncWithServer();
}
if (value == "CLEAR") {
clearServerData();
}
},
Agora instalamos o DIO e nossa aplicação já está preparada para ter ao menos um ambiente de interação com a pessoa usuária onde ela pode salvar, sincronizar e remover os dados da nuvem.
Ainda falta programarmos essa parte. É o que vamos fazer na sequência. Te vejo lá!