Alura > Cursos de Mobile > Cursos de Flutter > Conteúdos de Flutter > Primeiras aulas do curso Flutter: implementando persistência de dados com Drift e Hive

Flutter: implementando persistência de dados com Drift e Hive

Conhecendo o Drift - Apresentação

Boas-vindas a este curso de Flutter abordando Persistência de Dados com Drift e Hive, com o instrutor Ricarth Lima.

Audiodescrição: Ricarth é um homem de cabelo crespo, pele dourada e barba, usa óculos de armação escura, veste uma camiseta azul-escura e está à frente de uma parede lisa com uma iluminação azul e rosa.

Agora, vamos falar do projeto. Ele será o nosso Listin, uma lista de compras para planejarmos as compras e feiras que fazemos no supermercado. Se você já conhece esse projeto da Formação Firebase, não se preocupe. Você vai notar que ele está diferente, pois vamos construí-lo totalmente do zero com outras funcionalidades. Portanto, não é necessário ter visto a Formação Firebase.

Se fizermos o login e clicarmos em Tela Inicial, iremos justamente para a nossa tela inicial, onde podemos adicionar nossas listas de compra. Então, se vamos fazer uma feira semanal, apenas para reposição, colocamos o título "Feira Semanal", e nas observações, "Só para reposição".

Vamos salvar, e agora que salvamos, podemos editá-lo, podemos removê-lo, e dentro da nossa lista de compras, que chamamos de Listin, podemos adicionar um produto. Então, vamos adicionar uvas. Quantas uvas? Duas. Qual é o preço? Cinco. Vamos salvar. E as uvas já ficam aqui nos nossos Planejados.

Quando estivermos no supermercado e colocarmos a uva no carrinho, podemos até atualizar a quantidade que queremos, o preço que está lá de fato, e não o que planejamos, e damos um check para ver quanto está ficando a nossa compra.

E como fazemos isso? Fazemos isso usando justamente o Drift e o Hive, que são duas das principais ferramentas de persistência de dados que temos no mercado de Flutter atualmente. O Drift para relacional, e o Hive para não relacional.

E qual a importância de conhecer essas duas ferramentas? Para que você, na hora que estiver planejando o aplicativo da sua empresa, ou da sua ideia pessoal, possa decidir qual banco de dados e qual pacote vai usar. Esse é um conhecimento valiosíssimo que vamos aprender neste curso.

Vamos aprender como configurar, como inicializar e como fazer as operações, tanto usando o Drift, quanto usando o Hive, para que quando chegar a hora de usar esse conhecimento na sua empresa, você possa colocar a mão na massa.

E quais são os pré-requisitos? O que você precisa saber para começar este curso? É bom que você tenha uma boa base de Dart e de Flutter.

Para isso, recomendamos muito ter feito nossa formação Dart e nossa formação Flutter, e já venha com seus conhecimentos bem consolidados.

Vale dizer que neste curso não criaremos telas, as telas já serão entregues prontas para nós, para focarmos no Drift e no Hive. Portanto, é muito importante você já ter esse conhecimento vindo da formação Flutter.

Esperamos que você esteja tão ansioso ou ansiosa quanto nós para começarmos este curso. Vamos começar logo na sequência. Te vejo lá!

Conhecendo o Drift - Preparando o ambiente e objetivos

Agora que já nos conhecemos, chegou a hora de conversarmos sobre alguns detalhes que vão tornar o fluxo do nosso curso mais agradável.

A primeira coisa é falar sobre o projeto. No vídeo anterior, vimos o resultado final do nosso projeto, mas agora vamos falar sobre o projeto base.

Para isso, estamos com ele aberto. Normalmente, falamos do projeto base no tópico "Preparando Ambiente", mas é muito importante que você preste atenção, pois esse projeto base terá todas as telas que vamos usar.

Você pode baixá-lo na atividade "Preparando Ambiente" e ele já terá todas as telas que vamos usar. Qual é a grande questão? A questão é que não terá a lógica, e é essa lógica que precisamos implementar.

Então, se abrirmos o emulador, você verá que ele já começa aqui em uma tela de autenticação. E aí, você se pergunta, vamos lidar com a autenticação nesse curso? Não.

Isso é só parte do fluxo natural da aplicação, mas não tem nenhuma autenticação implementada, e nós não vamos implementar. Então, por isso, ele já vem com e-mail e senha aqui pré-definidos. Basta clicar em Entrar que vai aparecer um snackbar dizendo que não tem nenhuma autenticação implementada. Quer ir para a tela inicial? Basta clicar em Tela inicial que chegamos aqui.

A tela inicial tem o appbar, tem uma tela vazia que permite que no futuro adicionemos uma lista, tem um drawer, mas o que importa para nós é esse botão no canto inferior direito com o símbolo de soma (+), o Floating Action Button, para adicionarmos uma nova lista de compras, que chamamos carinhosamente de listin.

Você vai notar que, apesar de não adicionarmos nada no nome e nas observações, se clicarmos em Salvar, já aparece uma "feira do mês" aqui. Por que isso? Porque o código está mockado, e é um código apenas para a interface. Faremos nesse curso toda a lógica para adicionar, remover, ler e editar um listin.

Clicando na "Feira do mês", vamos para a lista de produtos que por enquanto está vazia, mas se seguirmos a mesma lógica, clicar no Floating Action Button, clicar em Salvar sem precisar adicionar nada, você vai ver que ele adiciona um desinfetante, só para termos uma boa ideia de como essa interface se comporta.

Então, clicando no desinfetante, ele vem aqui para a parte de baixo e pronto. Essa é a interface que vamos usar, e aplicaremos a lógica usando o Drift e o Hive.

Estrutura de pastas

Agora, quando você baixar esse projeto lá no "Preparando Ambiente", você pode notar que ele tem uma estrutura de pastas bem definida. Se você abrir a pasta lib, com o explorador aberto, você vai ver que temos quatro pastas e a nossa main, a _core, authentication, listins e products.

A _core é onde estão todos os arquivos que nossas funcionalidades usam, independente de qual seja. Então, todas as funcionalidades vão usar esses arquivos.

Você não precisa se preocupar com a pasta authentication, ela é feita para criar aquela tela inicial. Listins é onde temos na pasta screens, a nossa Home_screen, que é a tela inicial onde vemos as listas de compras. E products tem os produtos.

Se você entrar em cada uma delas, você vai notar que tem models, screens, services, cada um com arquivos. Alguns deles são só para a interface.

E o que precisamos criar para dar a lógica de salvar os dados, nós vamos fazer no curso, não se preocupe. Mas recomendamos que, quando você baixar esse projeto lá no "Preparando Ambiente", você dê uma boa olhada nessas pastas e explore os arquivos.

Se abrirmos o meu terminal, você vai ver que na aba PROBLEMS, não é exatamente um problema, mas temos vários to-dos, ou seja, blocos de códigos, lugares de código que não estão implementados ou têm códigos mockados e vão ser úteis ao decorrer do curso.

Então, recomendamos muito que você pare um tempinho e dê uma olhada nesse projeto base para entender como a tela está funcionando antes de vermos a implementação das funcionalidades.

Versão do Flutter

Temos um recado também muito importante, agora que estamos aqui já com o terminal aberto. Vamos abrir o terminal de fato e escrever aqui flutter --version.

Por que isso é importante? Porque você com certeza está vendo esse vídeo no futuro. Então, você precisa saber que esse curso foi gravado na versão 3.16.9 do Flutter com a versão do Dart 3.2.6.

E por que isso é importante? Porque o Flutter se atualiza bastante. Então, recomendamos que você instale essa versão do Flutter e do Dart para que consigamos conversar, para que não haja discrepância entre o que estamos fazendo aqui e o que você vai ver no seu curso.

A mesma coisa funciona para caso a gente abra o Explorer, venha no pubspec.yaml e você vai ver que já tem alguns pacotes instalados. Esses pacotes são para a interface, mas ao longo do curso também vamos instalar alguns pacotes.

E da mesma forma, recomendamos que você sempre observe a versão e use a versão que estamos usando. Caso não seja possível, caso você queira usar a versão mais atualizada, seja do Flutter, seja dos pacotes, recomendamos que você também olhe a atividade "Preparando Ambiente", que lá vai ter alguns possíveis problemas que você pode enfrentar e como resolvê-los.

Distribuição da informação no projeto

E por último, queremos mostrar uma imagem que aborda como nós vamos distribuir a informação nesse nosso projeto. Então, se você já estudou modelagem de dados, banco de dados ou tem experiência com banco de dados, você sabe que isso é uma simplificação de um diagrama de dados.

Não é exatamente como lidamos, mas para simplificar e para entendermos o que estamos fazendo, temos aqui um diagrama de dados.

Diagrama de dados de um sistema com tema escuro, mostrando a relação entre 'Listin (Lista de Compras)' e 'Lista de Produtos'. O diagrama apresenta campos e tipos de dados para cada entidade, como ID, nome, observações, datas de criação e atualização, categorias, preços e quantidades. Elementos estão conectados por linhas que indicam relacionamentos.

Temos o listin, que vai ser nossa lista de compras, e o que é que ele tem de propriedades? Ele vai ter um ID, que é numérico, que é único e que é uma chave primária, vai ter um nome, que é uma string de 4 a 30 caracteres e por aí vai.

Para esse listin, nós vamos fazer todas essas operações no Drift. Já para os produtos que estão dentro de uma lista de compras, de um listin, nós vamos usar o Hive, e os produtos têm os seguintes atributos, o ID, o nome, a categoria, se é por quilo ou não, se está comprado ou não e assim por diante.

E essa imagem vai ser bem útil, e caso você queira revisitá-la, ela vai estar disponível em uma atividade a seguir também. Então, você pode revisitá-la para entender o que estamos fazendo, para ver como estão bem definidos os nossos modos, os nossos modelos, como vamos usar as classes, as entidades e por aí vai.

Estamos agora bem alinhados e alinhadas com o nosso conhecimento e agora podemos pegar essa demanda que chegou e trabalharmos juntos, eu e você, para implementar a persistência de dados nesse projeto. Vamos lá!

Conhecendo o Drift - Instalando o Drift

Agora que compreendemos nossos objetivos e o projeto básico que vamos usar para alcançá-los, é hora de instalar nossa primeira ferramenta, o Drift.

Normalmente, esses vídeos de instalação não são muito mais do que executar uma linha de comando, um flutter pub add, e assim por diante.

Nesse caso, é um pouco diferente, porque estamos lidando com um banco de dados, e o Drift implementa várias capacidades do SQL, como a verificação segura de consultas, migrações, versionamento e até mesmo linhas de comando. Portanto, vai um pouco além de apenas executar um flutter pub add.

Claro que temos a documentação para nos ajudar, e por isso já estamos com ela aberta. Se você clicar no menu lateral Setup, ele exibirá as dependências.

Quando você estiver nesta documentação, que estará disponível em um "Para Saber Mais", você pode clicar com o botão direito e pedir para traduzir. Mas, já usando ela aqui em inglês, você verá que tem as dependências que são necessárias, e são seis dependências.

Isso porque, além do Drift, ele precisa de outros pacotes, outros plugins, para que tudo funcione corretamente e tudo se correlacione. Então, temos o drift, o sqlite_flutter_libs, o path_provider, o path, o drift_dev, e o build_runner, essas duas últimas como dependências de desenvolvimento (dev_dependencies).

É possível instalar tudo de uma vez? Sim. Na verdade, basta copiar o código a seguir, já preparado para que você faça a instalação automática e não fique instalando um por um.

dart pub add drift sqlite3_flutter_libs path_provider path dev:drift_dev dev:build_runner

Então, copiamos todo esse código no bloco, vamos dar um Ctrl + C, voltando no meu VSCode, vamos dar um Ctrl + V no terminal. Pressionando a tecla Enter, ele vai instalar todas essas dependências de uma vez e rodar o flutter pub get para nós.

Então, ele instalou tudo, rodou o flutter pub get, observarmos o arquivo pubspec.yaml, vamos ver que ele instalou o drift, o sqlite3, o path_provider, o path, e na dev_dependencies, ele instalou o drift_dev e o build_runner.

Mais uma vez, preste atenção às versões desses pacotes, pois usar as mesmas versões que estamos usando, garante que não terá nenhuma surpresa durante o seu aprendizado.

Mas vamos falar sobre cada uma dessas dependências rapidamente para você, que deve estar se perguntando o que cada uma dessas coisas faz.

O drift é o pacote central, que faz todo o trabalho de comunicação, de abstração do SQL usando o Dart. Já o sqlite3_flutter_libs é a biblioteca que adiciona, de fato, o SQLite3 no nosso aplicativo.

O path e o path_provider são bibliotecas do Flutter que nos ajudam a entrar em diretórios do nosso sistema operacional que está sendo usado, na maioria dos casos, Android e iOS nos dispositivos móveis. Então, ele vai nos ajudar e mais para frente vamos ver a importância disso.

Já o drift_dev e o build_runner são dependências de desenvolvimento. A grande questão é que ela não é instalada no final, quando rodamos a aplicação, quando damos um build na aplicação para ir para as pessoas usuárias, para ir para as lojas e assim por diante.

Elas só funcionam para nós que estamos desenvolvendo. A drift_dev serve para fazer toda uma geração de códigos automática se comunicando com a build_runner, que esse é um pacote do Flutter para gerar códigos automaticamente. Vamos ver isso quando chegar o momento.

Utilizando o Drift

Agora que falamos das dependências que o Drift usa, vamos falar um pouco sobre esse tal de Drift e porque o estamos usando.

O Drift antigamente se chamava Moor. Então, se você trabalhar em uma empresa ou mesmo ver artigos na internet que se referem ao Moor, você sabe que agora o nome novo dele, de uma versão mais atualizada, é Drift.

O que é o Drift?

O Drift é uma biblioteca de banco de dados relacional. E como é um banco de dados relacional, se espera que ele rode em SQL, como a linguagem de consultas estruturadas. Então, a versão de SQL que ele roda, o tipo, melhor dizendo, de SQL é o SQLite. Como eu falei, que roda em cima do SQL.

Quais são as vantagens do Drift?

A principal delas, na verdade, é não escrever consultas SQL. Você pode escrever se você quiser, se você tiver um caso específico. Mas, você vai estar usando todo o know-how de SQL. Toda a experiência do SQL, toda a base de anos que o SQL tem no mercado, sem precisar escrever as consultas de SQL usando só Dart. Essa é a principal vantagem do Drift.

E as desvantagens?

A principal desvantagem é a configuração. Então, ele tem uma configuração, a carga de configuração é pesada. Ele tem uma dificuldade maior, por exemplo, se você estiver usando web, e não aplicativo mobile, Android, iOS.

Então, tem essa questão, mas principalmente a curva de aprendizagem. Para usar o Drift, é importante que você já tenha uma base de SQL. Porque, apesar de você usar Dart, você vai ver pontos ali que se sobrepõem, que você vai notar que tem toda uma questão de modelagem de dados, modelagem de banco de dados, entidade, relação, que conforme o projeto vai crescendo, é importante que a equipe tenha essa experiência.

Quem deve usá-lo?

E, portanto, é recomendado para equipes e projetos que já têm experiência com modelagem relacional usando SQL.

Então, se você já faz parte de uma empresa que já tem uma boa experiência com SQL, já trabalhou em outros projetos com SQL, e quer ter essa experiência para o Flutter, o Drift provavelmente é a sua melhor escolha.

Agora que já entendemos o Drift, já instalamos ele no nosso projeto, já podemos começar a criar nossas listas? Não, ainda tem uma boa parte de configuração que vamos fazer logo na sequência. Vejo você lá.

Sobre o curso Flutter: implementando persistência de dados com Drift e Hive

O curso Flutter: implementando persistência de dados com Drift e Hive possui 132 minutos de vídeos, em um total de 59 atividades. Gostou? Conheça nossos outros cursos de Flutter em Mobile, ou leia nossos artigos de Mobile.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda Flutter acessando integralmente esse e outros cursos, comece hoje!

Conheça os Planos para Empresas