Já aprendemos a importar o nosso projeto base e a configurar o Firebase neste projeto. Agora, chegou a hora de importarmos as classes e as telas que usaremos. Se abrirmos a pasta "firebase_produtos", teremos outra pasta dentro dela com o mesmo nome. Abrindo esta segunda, teremos duas pastas: "model" e "presentation".
Pegaremos a pasta mãe da "model" e da "presentation", abriremos o VS Code e arrastaremos o "firestore_produtos" dentro da pasta "lib" no VS Code. Em "lib", já temos separadas em pastas diferentes os arquivos que usamos no curso anterior ("firestore") e os que usaremos neste ("firestore_produtos"). Adicionada a pasta, podemos fechar o Explorador de Arquivos.
Se expandirmos a pasta "firestore_produtos" no VS Code, observaremos que a estrutura segue o mesmo padrão, com as pastas "model" e "presentation". "Model" terá somente o arquivo "produto.dart", que contém a classe Produto.
Como toda classe, Produto representa algo do mundo real. Neste caso, ela representa os produtos que estarão na nossa lista de compras. Cada produto terá:
- Id;
- Nome;
- Preço;
- Quantidade;
- Se ele foi comprado ou não.
Esta informação é importante para sabermos quando um produto já está no carrinho e quando não está.
Depois, temos o construtor nomeado para transformarmos um Map da internet neste objeto do tipo Produto e o método toMap() para transformarmos este objeto em Map para enviá-lo pela internet.
Expandindo a pasta "presentation", teremos "widgets" e "produto_screen.dart", que recebe um listin, ou seja, uma entrada na nossa lista. Quando clicarmos em um listin, queremos abrir a tela de produtos relacionada à ele.
Faremos essa configuração agora para podermos vê-la na tela. Clicaremos em Explorer e abriremos a pasta "firestore", do curso anterior. Clicaremos em "presentation" e "home_screen.dart".
Queremos dar o comportamento de clique para que ele envie a feira de outubro para a tela de produtos. Para fazer isso, basta encontrar o ListTile que representa cada um deles.
Por enquanto, esse ListTile está exibindo apenas um print("clicou"). Apagaremos esse print e o substituiremos por Navigator.push(context, MaterialPageRoute(builder: builder));. Pode ser apenas o push() porque queremos voltar a esta tela quando a ação estiver terminada em Produtos.
Em seguida, substituiremos o builder por context no MaterialPageRoute. Em seguida, chamaremos o ProdutoScreen, que nos pedirá um listin. Mais acima no código, observaremos que já estamos rodando o model de listin, que serve para preencher essa lista. Então, passaremos o model em questão para que cada um tenha um listin.
O resultado será o seguinte:
Navigator.push(context, MaterialPageRoute(builder: (context) => ProdutoScreen(listin: model),));
Salvaremos a alteração e agora veremos como ela se comporta. Voltando ao emulador, se clicarmos em "Feira de Dezembro", uma nova tela abre.
As informações contidas nela são o nome do listin, o total previsto na compra, que só é somado quando o produto é inserido em "Comprado". Além disso, temos duas listas: produtos planejados e produtos comprados. Para cada uma, temos um objeto ListTile que contém as informações do produto (nome, quantidade, preço e se foi comprado ou não).
Se voltarmos à ProdutoScreen, encontraremos duas listas: listaProdutosPlanejados e ListaProdutosPegos. Alimentaremos cada uma delas até ambas ficarem configuradas para que apareçam os widgets que representam esses produtos.
Dessa vez, não colocamos o ListTile original do Flutter. Isso porque precisávamos fazer algumas configurações que seriam interessantes de serem modularizadas em um widget próprio.
Para isso, criamos o ListTileProduto. Se abrirmos o Explorador, veremos o arquivo "list_tile_produto.dart". Lá, conseguiremos ver o ícone que fica ao lado do item, o texto que muda se temos a quantidade do produto ou não.
Na interface que estávamos usando de exemplo, o title "Maçã" está sem uma quantidade' porque essa informação não foi acrescentada ao produto.
Já o item "Laranja" tem uma indicação de "(x5)" ao lado do nome, para indicar que há cinco unidades daquele item. Já o subtitle nos mostra o preço ou clique para adicioná-lo, caso ele esteja ausente. Foram estes os detalhes que nos levaram a personalizar o ListTile.
Com isso, já sabemos como a tela funciona e o que precisamos fazer para integrar o Firebase com a nossa tela de produtos, uma subcoleção do nosso listin. Na sequência, começaremos falando de adição e alteração. Te vejo lá!