Agora que já entendemos como funciona a estrutura de arquivos e pastas do projeto Bytebank, chegou a hora de cumprir nossa demanda, que é justamente exibir o saldo nas outras telas, ou seja, na tela de transferência e na tela de extratos. Vamos nessa?
Implementando a demanda do saldo
Nós sabemos que o saldo está modularizado em um widget chamado BalanceWidget. Na HomePage (home_page.dart), utilizando o Visual Studio Code, ele está localizado na linha 23.
homepage.dart:
body: const HomeBackgroundWidget(
children: [
HomeTitleWidget(),
BalanceWidget(),
],
),
Se pressionarmos "Ctrl" e clicarmos sobre BalanceWidget, será aberto o arquivo balance_widget.dart, onde podemos observar alguns detalhes.
Por exemplo: na linha 14, encontramos o texto "Saldo"; há também um separador (Divider()) na linha 24; o texto "Conta Corrente" na linha 27; e por fim, na linha 33, temos o texto que exibe o saldo. Por enquanto, usamos um saldo fictício definido diretamente no texto, afinal, ainda não temos nenhuma conexão com o back-end.
Mas qual é a melhor forma de modularizar e reutilizar esse widget em outras telas?
Para isso, devemos prestar atenção no explorador de arquivos à direita. Notaremos que o widget BalanceWidget está dentro da pasta "home > widgets". Isso indica na arquitetura que esse widget é usado apenas pelas funcionalidades de Home, mas isso não é mais verdadeiro.
Nós queremos usar esse mesmo widget em todas as telas que temos até agora. Para que as outras telas tenham acesso a ele usando a estrutura de pastas que definimos, vamos transportá-lo para a pasta "_core".
Abrindo essa pasta, veremos que ela contém uma subpasta "widgets". Então, basta arrastar o arquivo balance_widget.dart da pasta "widgets" de "home" para a pasta "widgets" de "_core".
Ao fazer isso, o VS Code pergunta se realmente queremos mover o arquivo. Após responder que sim ("Move"), ele traz a seguinte informação: o Dart deseja refatorar alguns arquivos para que essa mudança de pastas não cause erros, permitindo que tudo continue funcionando da mesma forma. Vamos concordar com isso clicando em "OK".
Com a permissão, notamos na aba superior que dois arquivos foram alterados: o balance_widget.dart e o home_page.dart. Vamos confirmar as alterações clicando para salvar com o atalho "Ctrl + S" em ambos.
No caso do instrutor, houve um pequeno erro, pois estava sendo executada a aplicação, mas basta solicitar ao controlador para reiniciar a aplicação que tudo funcionará como esperado.
Feito isso, podemos fechar o arquivo framework.dart aberto com erro, e constatar no emulador que tudo funciona como esperado.
Adicionando o BalanceWidget à tela StatementPage
Agora vamos incluir o BalanceWidget nas outras telas.
Nesse momento, vamos identificar se a modularização e as estruturas que criamos valeram a pena, ou seja, se conseguiremos fazer isso de forma rápida e direta.
Sabendo que chamávamos esse widget na HomePage da funcionalidade "home", e desejamos adicioná-la, por exemplo, à tela de extrato, basta acessar a pasta "statement", procurar por uma pasta chamada "screens", e abrir o arquivo statement_page.dart.
O código dessa tela segue um padrão bastante semelhante à tela de HomePage. Ela é basicamente um Scaffold que importa a appBar e o drawer, e como corpo (body), tem o StatementBackgroundWidget, que faz configurações como cor de tela, decoração, imagem, borda e assim por diante.
Dessa forma, dentro de children, tudo que precisamos fazer é, na linha 40, adicionar uma nova constante chamada BalanceWidget. A importação será feita automaticamente.
statement_page.dart:
children: [
const StatementTitleWidget(),
const BalanceWidget(),
const HeightMargin(MarginType.large),
StatementTransfersListWidget(listTransfers: listTransfers),
],
Lembre-se de adicionar uma vírgula após BalanceWidget() para evitar erros.
Como estamos seguindo um padrão de espaçamento, vamos copiar a linha 43, que contém um widget de espaçamento, e colaremos na linha 42, para separar o título do saldo.
children: [
const StatementTitleWidget(),
const HeightMargin(MarginType.large),
const BalanceWidget(color: BytebankColors.black),
const HeightMargin(MarginType.large),
StatementTransfersListWidget(listTransfers: listTransfers),
],
Feito isso, vamos salvar e verificar como está sendo exibido no nosso extrato. Ao acessar o drawer e clicar em "Extrato", notamos algo interessante no emulador.
Na realidade, o widget está presente, porém, como está em branco, não é possível visualizar. Faremos a mesma alteração nas transferências e, posteriormente, resolveremos a questão da cor.
Adicionando o BalanceWidget à tela TransfersPage
A implementação para a página de transferências será bem simples e igual ao que fizemos anteriormente. Então, podemos copiar as linhas 42 e 43 que adicionamos a statement_page.dart e, após fechar essa aba, vamos abrir o explorador no canto superior direito.
Em seguida, clicaremos no símbolo que representa dois quadrados com um sinal de menos (-), localizado próximo ao ícone do explorador. Isso fará com que todas as pastas sejam colapsadas, facilitando a organização. Depois disso, podemos ir diretamente em "lib > transfers". Em seguida, vamos até a pasta "screens" e abriremos o arquivo transfers_page.dart.
Com o arquivo aberto, percebemos que sua complexidade é um pouco maior devido à quantidade de elementos presentes. No entanto, ela segue o mesmo padrão das demais, importando a appBar e o drawer, e o corpo da página é um TransferBackgroundWidget que realiza toda a configuração.
Logo após o TransferTitleWidget, na linha 37, vamos colar o trecho copiado.
transfers_page.dart:
children: [
const TransferTitleWidget(),
const HeightMargin(MarginType.large),
const BalanceWidget(color: BytebankColors.black),
const HeightMargin(MarginType.large),
Aparecerá um erro em BalanceWidget, pois ainda não realizamos a importação. Clicando no ícone de lâmpada, podemos pedir para o VS Code importar. Após a importação, salvaremos as alterações.
Ajustando a cor de BalanceWidget
Agora, na página de transferência, ocorre a mesma situação anterior, referente à cor.
Para resolver a situação, basta definir a cor que desejamos passar para esses componentes, em vez de ter uma cor fixa, que é o branco.
No arquivo balance_widget.dart, em StatelessWidget na linha 5, podemos solicitar uma cor. Então, na linha 6, vamos implementar um final do tipo Color chamado color.
Feito isso, precisamos passar color no construtor. Para isso, na linha 7, faremos um required this.color. Com isso, já receberemos a cor.
balance_widget.dart:
class BalanceWidget extends StatelessWidget {
final Color color;
const BalanceWidget({super.key, required this.color});
Agora, todas as linhas onde usávamos BytebankColors.white, simplesmente substituiremos por color. Então, vamos acrescentar color na linha 19, por exemplo.
Text(
"Saldo",
style: TextStyle(
fontSize: 20,
color: color,
fontWeight: FontWeight.w600,
),
),
Ao fazer isso, precisaremos de outra alteração, pois Column ainda é uma constante (const) e não pode mais ser, já que a cor pode variar a depender do parâmetro. Portanto, lembre-se de remover o const da linha 11 para corrigir o erro.
Acrescentaremos color também na linha 25. Além disso, iremos acrescentar o const no padding da linha 24.
Padding(
padding: const EdgeInsets.symmetric(vertical: 8.0),
child: Divider(color: color, thickness: 2),
),
Não se preocupe com o aviso de erro nesse momento, pois, como vamos inserir cores variáveis em todos os componentes, o warning será removido, afinal, eles não serão mais constantes.
Faremos o mesmo na linha 30, substituindo o TextStyle do texto "Conta Corrente" por color.
Text(
"Conta Corrente",
style: TextStyle(
color: color,
fontSize: 16,
),
),
Por fim, substituimos por color no TextStyle do texto que indica o saldo, na linha 37.
Text(
"R\$ 2.500,00",
style: TextStyle(
color: color,
fontSize: 32,
),
),
No momento, em nossas telas, não definimos nenhuma cor. Vamos corrigir isso rapidamente. Para finalizar, fecharemos o BalanceWidget, e primeiramente em TransfersPage, notamos que o fundo é branco, então, o preto é uma boa escolha.
Com isso em mente, entre os parênteses de BalanceWidget() na linha 40, vamos inserir o argumento color e passar para ele o valor BytebankColors.black.
transfers_page.dart:
children: [
const TransferTitleWidget(),
const HeightMargin(MarginType.large),
const BalanceWidget(color: BytebankColors.black),
const HeightMargin(MarginType.large),
Já para HomePage, vamos definir a cor branca, pois o fundo é verde. Então, na linha 23, adicionaremos o argumento color passando o valor BytebankColors.white.
home_page.dart:
children: [
HomeTitleWidget(),
BalanceWidget(color: BytebankColors.white),
],
Ainda haverá um erro na tela de extrato (StatementPage), então vamos abrir o arquivo statement_page.dart e adicionar o argumento color: BytebankColors.black na linha 43, pois o fundo é cinza.
statement_page.dart:
children: [
const StatementTitleWidget(),
const HeightMargin(MarginType.large),
const BalanceWidget(color: BytebankColors.black),
const HeightMargin(MarginType.large),
StatementTransfersListWidget(listTransfers: listTransfers),
],
Conclusão
Agora, ao verificar o emulador, o saldo aparece na tela de transação, por exemplo, com as cores em tons mais escuros, em preto. Desse modo, conseguimos visualizar muito bem, com um contraste interessante. O mesmo ocorre na tela de extrato e, como sempre, a página inicial continua inalterada.
Incrível, não é? Atendemos à nossa primeira demanda! Na próxima etapa, teremos uma reunião com todo o time do Bytebank. Vamos lá?