Boas-vindas a mais um curso de Flutter na Alura.
Meu nome é William Bezerra, sou instrutor na Escola de Mobile na Alura. Acompanharei vocês ao longo deste curso.
Audiodescrição: William é um homem pardo com cabelos, barba e bigodes pretos. ELe usa óculos de aros grandes. Ao fundo, há uma parece com iluminação degradê do rosa para o azul.
Ao longo deste curso, trabalharemos com um aplicativo de checklist para uma grande rede varejista. A ideia é garantir o funcionamento online e offline, pois um dos requisitos é que funcione em ambientes com conexão de internet instável.
Ao final do curso, teremos um projeto em que mais de uma pessoa poderá interagir na aplicação e a sincronização com os demais dispositivos será automática. No contexto offline, o aplicativo continuará funcionando e será capaz de sincronizar assim que a conexão for retomada.
Utilizaremos o Couchbase como base de dados, que possibilitará a sincronicidade das informações.
Para construirmos este projeto juntos, é importante que você já entenda conceitos básicos de Flutter e uso de dados de maneira geral, como fazer parse de informações e trabalhar com banco de dados.
Se isso chamou sua atenção e você está curioso para entender como vamos construir tudo isso, esperamos você na próxima aula.
Você foi contratado por uma grande rede varejista para criar um aplicativo de checklist para uso dos funcionários. Junto do nosso time, começamos a estruturar, fazer o levantamento de requisitos, entender os possíveis problemas, desenhar toda a parte de interface e experiência do usuário.
Em um determinado momento, lembramos de um problema ocorrido no supermercado na noite anterior: ao fazer compras, ficamos em dúvida sobre qual produto levar. Tentamos enviar uma mensagem no grupo da família, mas a mensagem não foi enviada.
Isso nos fez perceber que, dentro do supermercado, a internet pode funcionar de maneira instável, o que é muito comum. Assim, trouxemos essa questão para o cenário de construção do aplicativo. É interessante que ele funcione tanto de modo online quanto offline.
Caso contrário, podem surgir problemas durante o uso, como um funcionário coletar o mesmo produto que outro ou um produto não chegar ao usuário final. É crucial garantir a estabilidade do aplicativo em ambos os modos.
Uma das metodologias mais aceitas é a offline first, em que garantimos que o aplicativo seja construído para funcionar primeiro offline e, ao estabelecer uma conexão com a internet, funcione de modo online. Ou seja, ele salva os dados no dispositivo e os envia para o servidor externo, quando possível.
No Flutter (a linguagem que utilizamos), uma das metodologias mais aceitas é usar um banco de dados NoSQL chamado Couchbase, que possibilita a sincronicidade entre o banco de dados local e o online.
Para prosseguir nesta aula, é importante que já tenhamos feito a atividade anterior, em que fizemos a preparação do ambiente e onde está toda a base de código para ser utilizada no projeto.
Após baixar e clonar o projeto, rodamos o comando flutter pub get
, conforme definido na atividade. Isso nos dará uma base de código com todas as interfaces prontas, mas funcionando apenas de maneira visual. Ou seja, podemos adicionar, apagar e editar, mas apenas localmente, pois as funções estão mocadas, isto é, simuladas.
Partindo desse princípio, iniciaremos as configurações do Couchbase para criar as integrações corretamente, funcionando primeiro offline (offline first) e depois online, com a sincronicidade entre bancos com o Couchbase.
Para isso, precisamos adicionar três packages ao projeto. O primeiro é o package do Couchbase, chamado CBL (Couchbase Lite). No terminal do VS Code, dentro da pasta do projeto, rodamos o seguinte comando:
flutter pub add cbl
Este primeiro package é uma implementação genérica do Couchbase para funcionar no Dart. Em outras palavras, instalamos a estrutura original do Couchbase (CBL) e, a seguir, instalaremos o package do cbl_flutter
, que adapta o Couchbase para o Flutter. Basta executar o seguinte comando:
flutter pub add cbl_flutter
Assim, temos praticamente tudo para a configuração inicial do Couchbase. No entanto, é preciso escolher a versão do Couchbase a ser utilizada. Podemos optar entre as versões:
Para selecionar a versão Community Edition (CE), usaremos o seguinte comando:
flutter pub add cbl_flutter_ce
Dessa forma, já adicionamos todos os packages necessários. Vamos verificar o pubspec.yaml
, o arquivo principal do projeto em que estão as dependências. Da linha 42 a 44, encontraremos as três novas alterações: cbl
, cbl_flutter
e cbl_flutter_ce
, com suas versões estáveis.
Para finalizar, rodaremos o comando flutter pub get
para garantir que tudo está sincronizado corretamente no projeto. Para garantir que o Couchbase está completamente instalado, precisamos inicializar o package no projeto. Ou seja, antes de rodar o aplicativo, é necessário garantir que o Couchbase está disponível.
No menu lateral esquerdo, dentro da pasta "lib", acessaremos o main.dart
, o arquivo principal do aplicativo, que estará apenas executando o aplicativo com runApp()
:
Arquivo
main.dart
import 'package:flutter/material.dart';
import 'app/app_widget.dart';
void main() {
runApp(const MyApp());
}
Precisamos que o Couchbase seja inicializado antes de rodar o aplicativo. Para isso, chamaremos CodebaseLiteFlutter.init()
, antes do runApp()
. Além disso, injetaremos o package cbl_flutter
no projeto, na linha 1:
import 'package:cbl_flutter/cbl_flutter.dart'
import 'package:flutter/material.dart';
import 'app/app_widget.dart';
void main() {
CouchbaseLiteFlutter.init();
runApp(const MyApp());
}
Precisamos esperar ele iniciar antes de rodar o aplicativo, então vamos inserir um await
antes do CodebaseLiteFlutter.init()
. Logo, é necessário transformar a função void main()
em Future<void> main()
, também tornando-a assíncrona com o async
:
// ...
Future<void> main() async {
await CouchbaseLiteFlutter.init();
runApp(const MyApp());
}
Dessa maneira, o Couchbase será inicializado, mas ainda precisamos garantir que o Flutter será inicializado antes dessa execução. Portanto, adicionaremos WidgetsFlutterBinding.ensureInitialized()
no início da nossa função:
// ...
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await CouchbaseLiteFlutter.init();
runApp(const MyApp());
}
Assim, garantimos que, ao rodar o aplicativo, ele inicializará todas as funções necessárias, depois o Couchbase, e então executar o app. Como já instalamos a dependência da Community Edition, o Couchbase já sabe qual versão usar, sem necessidade de configuração específica, pois ele já utiliza a instalada no package.
Agora que o Couchbase foi instalado, precisamos configurar e implementar um serviço para utilizar suas funções ao longo da aplicação. Isso é essencial para termos uma abstração eficaz da plataforma e de toda a estrutura lógica do que será feito.
Para iniciar essa configuração, vamos voltar ao projeto no VS Code. Acessaremos a pasta "lib" e, dentro dela, a pasta "app", onde estão todas as camadas do nosso aplicativo. Dentro de "app", criaremos uma pasta chamada "services". Basta clicar com o botão direito, selecionar "New folder" (nova pasta) e digitar o nome "services".
Dentro da pasta "services", criaremos um serviço específico para a implementação do Couchbase. Podemos nomeá-lo de várias formas, mas utilizaremos o nome mais óbvio: couchbase service. Assim, criaremos um arquivo chamado couchbase_service.dart
.
Nele, vamos inicializar uma classe:
Arquivo
couchbase_service.dart
class CouchbaseService {
}
A primeira implementação dentro dessa classe será a inicialização do banco de dados. Logo, criaremos um nullable AsyncDatabase
chamado database
. A importação do CBL aparecerá automaticamente na primeira linha do arquivo:
import 'package:cbl/cbl.dart';
class CouchbaseService {
AsyncDatabase? database;
}
Assim, conseguimos criar uma função para inicializar. Mas por que criamos uma variável? Vamos inicializar essa variável dentro do serviço para que depois possamos utilizar o mesmo database
em todas as operações, sem a necessidade de reinicializá-lo constantemente.
Agora, vamos criar uma função chamada init()
, com retorno void
. Ela será responsável por instanciar e iniciar o banco de dados. Definiremos a variável database
como Database.openAsync()
para criar ou recuperar a instância do banco de dados e, entre os parênteses, definiremos o nome database
:
import 'package:cbl/cbl.dart';
class CouchbaseService {
AsyncDatabase? database;
void init() {
database = Database.openAsync('database');
}
}
Inicialmente, o código indicará um erro, pois estamos trabalhando com um Future<>
, então é necessário utilizar o await
. Portanto, vamos adicionar o await
antes de Database.openAsync()
e transformar init()
em uma função assíncrona, que passará a ser uma Future<void>
:
import 'package:cbl/cbl.dart';
class CouchbaseService {
AsyncDatabase? database;
Future<void> init() async {
database = await Database.openAsync('database');
}
}
Assim, já temos a implementação de inicialização do Couchbase dentro do serviço. Por fim, vamos fazer uma configuração para checar se a variável database
é nula. Basta incluir duas interrogações antes da inicialização:
import 'package:cbl/cbl.dart';
class CouchbaseService {
AsyncDatabase? database;
Future<void> init() async {
database ??= await Database.openAsync('database');
}
}
Essa implementação garante que o banco de dados seja inicializado apenas uma vez. Caso já esteja iniciado, a função não fará nada. Isso é útil, pois podemos chamar a função de inicialização sempre que necessário, mas ela só executará se o banco de dados ainda não estiver iniciado.
O curso Flutter: implemente offline first com Couchbase em um app possui 140 minutos de vídeos, em um total de 45 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:
Impulsione a sua carreira com os melhores cursos e faça parte da maior comunidade tech.
1 ano de Alura
Assine o PLUS e garanta:
Formações com mais de 1500 cursos atualizados e novos lançamentos semanais, em Programação, Inteligência Artificial, Front-end, UX & Design, Data Science, Mobile, DevOps e Inovação & Gestão.
A cada curso ou formação concluído, um novo certificado para turbinar seu currículo e LinkedIn.
No Discord, você tem acesso a eventos exclusivos, grupos de estudos e mentorias com especialistas de diferentes áreas.
Faça parte da maior comunidade Dev do país e crie conexões com mais de 120 mil pessoas no Discord.
Acesso ilimitado ao catálogo de Imersões da Alura para praticar conhecimentos em diferentes áreas.
Explore um universo de possibilidades na palma da sua mão. Baixe as aulas para assistir offline, onde e quando quiser.
Acelere o seu aprendizado com a IA da Alura e prepare-se para o mercado internacional.
1 ano de Alura
Todos os benefícios do PLUS e mais vantagens exclusivas:
Luri é nossa inteligência artificial que tira dúvidas, dá exemplos práticos, corrige exercícios e ajuda a mergulhar ainda mais durante as aulas. Você pode conversar com a Luri até 100 mensagens por semana.
Aprenda um novo idioma e expanda seus horizontes profissionais. Cursos de Inglês, Espanhol e Inglês para Devs, 100% focado em tecnologia.
Transforme a sua jornada com benefícios exclusivos e evolua ainda mais na sua carreira.
1 ano de Alura
Todos os benefícios do PRO e mais vantagens exclusivas:
Mensagens ilimitadas para estudar com a Luri, a IA da Alura, disponível 24hs para tirar suas dúvidas, dar exemplos práticos, corrigir exercícios e impulsionar seus estudos.
Envie imagens para a Luri e ela te ajuda a solucionar problemas, identificar erros, esclarecer gráficos, analisar design e muito mais.
Escolha os ebooks da Casa do Código, a editora da Alura, que apoiarão a sua jornada de aprendizado para sempre.