<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Lucas Oliveira</title>
    <description>The latest articles on Forem by Lucas Oliveira (@lucasvini382).</description>
    <link>https://forem.com/lucasvini382</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1071094%2Ff9c21f38-156f-482c-b539-9dda8d7ed013.png</url>
      <title>Forem: Lucas Oliveira</title>
      <link>https://forem.com/lucasvini382</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/lucasvini382"/>
    <language>en</language>
    <item>
      <title>Gerenciamento de estados utilizando o Flutter Bloc</title>
      <dc:creator>Lucas Oliveira</dc:creator>
      <pubDate>Tue, 20 Feb 2024 12:49:56 +0000</pubDate>
      <link>https://forem.com/lucasvini382/gerenciamento-de-estados-utilizando-o-flutter-bloc-318e</link>
      <guid>https://forem.com/lucasvini382/gerenciamento-de-estados-utilizando-o-flutter-bloc-318e</guid>
      <description>&lt;p&gt;Então pessoal lá no meu outro post que você pode conferir seguindo clicando &lt;a href="https://dev.to/lucasvini382/gerenciamento-de-estados-no-flutter-4ofc"&gt;aqui&lt;/a&gt; deu pra ver que o Flutter Bloc é um dos requisitos mais solicitados dentro das vagas publicadas pelos &lt;em&gt;hunters&lt;/em&gt; quando estão procurando desenvolvedores Flutter. Vamos entender um pouquinho da estrutura do BloC que pode e vai nos auxiliar muito no dia a dia, bem... Pelo menos para ser notados pelos recrutadores temos essa certeza né?!&lt;br&gt;
Vamos lá!&lt;br&gt;
Enquanto no Provider temos o gerenciamento de estados bem próximos ali dos Widgets, o BloC veio para dar uma mexida nisso, uma vez que poderemos separar o gerenciamento de estado em si da interface visual com que o usuário estará interagindo. &lt;br&gt;
Como assim separar?! Esse BloC chega assim como não quer nada e já vem colocando as coisas fora do lugar? Pois é meu caro amigo, se você parar pra pensar as nossas views não deveria ter a responsabilidade de saber o que deveria ser exibido para o usuário, ela tem responsabilidade apenas de buildar e exibir.&lt;br&gt;
Se você parar pra pensar vamos supor um caso que acontece demais, uma tela de lista de contatos que comunica-se com o back-end para trazer os dados do contato e mostrar para o usuário. Se você pensar rapidamente você pode até pensar que isso é apenas uma tela né?! Mas analisando direitinho você enxerga 3 telas dentro dessa.&lt;br&gt;
Tela é toda interface gráfica que entra em contato com o usuário.&lt;br&gt;
1 - Tela de loading enquanto o back-end processa a resposta;&lt;br&gt;
2 - Tela com a lista de contatos;&lt;br&gt;
3 - Tela de erro caso não obtermos o que aguardamos na resposta do back-end;&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdw9ct5n4qeblogiv9i7s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdw9ct5n4qeblogiv9i7s.png" alt="Image description" width="640" height="480"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:equatable/equatable.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:flutter/foundation.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HomeState&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;Equatable&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="n"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HomeLoadingState&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;HomeState&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HomeErrorState&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;HomeState&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="n"&gt;HomeErrorState&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="nd"&gt;@required&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HomeStateLoaded&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;HomeState&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="n"&gt;HomeStateLoaded&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="nd"&gt;@required&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;list&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HomeStateEmptyList&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;HomeState&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para esse estudo criei um repositório para pôr em prática os conhecimentos em Bloc que pode ser acessado &lt;a href="https://github.com/lucasvini382/flutter-bloc-architecture"&gt;clicando aqui&lt;/a&gt;&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>programming</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Gerenciamento de estados no Flutter</title>
      <dc:creator>Lucas Oliveira</dc:creator>
      <pubDate>Sun, 07 May 2023 16:29:25 +0000</pubDate>
      <link>https://forem.com/lucasvini382/gerenciamento-de-estados-no-flutter-4ofc</link>
      <guid>https://forem.com/lucasvini382/gerenciamento-de-estados-no-flutter-4ofc</guid>
      <description>&lt;p&gt;Realizamos um monte de cursos para aprender sobre o framework queridinho para a programação em mobile (Claro... estamos falando de Flutter) e desde o início dessas aulas que assistimos não paramos de escutar no seguinte tópico: Gerenciamento de estados. Ao longo desse post vou tentar te explicar para o que serve esse famoso e como ele irá nos ajudar no consumo de informações dentro de nosso aplicativo.&lt;/p&gt;

&lt;p&gt;Imagine o cenário em que você está criando uma aplicação voltado para um e-commerce utilizando uma arquitetura &lt;em&gt;MVVM&lt;/em&gt; onde temos dentro de uma View-Model os dados do carrinho de compras desse app. Pensa comigo... Enquanto você está saciando o seu desejo consumista vendo todos os produtos desse e-commerce e adicionando vários deles no seu carrinho você precisará desses mesmos produtos na sua tela de confirmação de pagamento para você pagar por cada um daqueles ítens que você adicionou previamente. E é justamente com gerenciamento de estados que temos esse compartilhamento de informações dentro do Flutter.&lt;/p&gt;

&lt;p&gt;No mercado existem várias opções de abordagens voltadas para o gerenciamento de estados, podemos citar como exemplo: Provider, GetX, MobX, BloC&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OuVb_rLt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sc1r65bbsrdapn3a1fcy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OuVb_rLt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sc1r65bbsrdapn3a1fcy.png" alt="Image description" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nesse gráfico conseguimos ver a quantidade de citações para as bibliotecas de gerenciamento de estados que são feitas para as vagas de desenvolvedor Flutter aí no mercado, já serve para termos um norteador do que estudarmos&lt;/p&gt;

&lt;p&gt;Iremos utilizar no exemplo o Provider para exemplificarmos o gerenciamento de estados no Flutter. Antes de vermos a instância do nosso objeto sendo renderizados em várias telas do nosso aplicativo precisamos entender o conceito do padrão Singleton.&lt;br&gt;
Este padrão irá garantir uma melhor performance em nossa aplicação visto que como o próprio nome do padrão diz teremos uma instância &lt;em&gt;"solteira"&lt;/em&gt; do nosso objeto a qual é acessível dentro de todo o contexto do aplicativo. Essa instância estará salva em memória.&lt;br&gt;
Para o contexto da nossa aplicação de e-commerce vamos ter o CartViewModel que será criado dentro do MultiProvider (escolhi utilizar o MultiProvider para relembrar a cada um de vocês que é possível criar mais de um em nosso aplicativo)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyApp&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatelessWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;MultiProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;providers:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="n"&gt;ChangeNotifierProvider&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;CartViewModel&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nl"&gt;value:&lt;/span&gt; &lt;span class="n"&gt;CartViewModel&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Main&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para reutilizarmos esse valor que está no CartViewModel podemos chamar o Provider.of para consumir os ítens contidos nele vou exemplificar utilizando o CartViewModel na CheckoutPage que seria a página a qual estaríamos finalizando o pagamento dos ítens contidos no CartViewModel.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CheckoutPage&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatelessWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@override&lt;/span&gt;
    &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;cartViewModel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Provider&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;of&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;CartViewModel&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cartViewModel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Certo Lucas... Você explicou como prover essas informações com o MultiProvider, explicou como consumir essas informações através do Provider.of mas como que eu atualizo e consumo essas informações atualizadas. Tcharam!! É aí que utilizaremos o método notifyListeners(). Vamos ver o trecho de código a seguir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;  &lt;span class="c1"&gt;/// Método responsável por adicionar um ítem&lt;/span&gt;
  &lt;span class="c1"&gt;/// na lista do carrinho e notificar nas páginas&lt;/span&gt;
  &lt;span class="c1"&gt;/// que consomem essa informação via Provider.&lt;/span&gt;
  &lt;span class="n"&gt;addItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="n"&gt;Item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;notifyListeners&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esse método adiciona um objeto do tipo Item a lista de Item e ao final dispara o notifyListeners() que irá justamente atualizar o valor de Items onde ele é usado, no nosso exemplo temos a CheckoutPage mas no cenário de uma aplicação de maior porte poderia ser consumido em diversos locais.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>tutorial</category>
      <category>dart</category>
      <category>statemanagement</category>
    </item>
  </channel>
</rss>
