<?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: Flutter</title>
    <description>The latest articles on Forem by Flutter (@flutterfans).</description>
    <link>https://forem.com/flutterfans</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%2Forganization%2Fprofile_image%2F1103%2F1f49d2b0-8484-4859-a064-efdd69aa5997.jpg</url>
      <title>Forem: Flutter</title>
      <link>https://forem.com/flutterfans</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/flutterfans"/>
    <language>en</language>
    <item>
      <title>Um estudo sobre Flutter Expanded</title>
      <dc:creator>Beatriz Herculano</dc:creator>
      <pubDate>Tue, 04 Feb 2020 14:09:41 +0000</pubDate>
      <link>https://forem.com/flutterfans/um-estudo-sobre-flutter-expanded-36jc</link>
      <guid>https://forem.com/flutterfans/um-estudo-sobre-flutter-expanded-36jc</guid>
      <description>&lt;p&gt;Esse artigo faz parte de uma série chamada "Widgets da Semana", para saber mais sobre essa ela leia nossa &lt;a href="https://dev.to/flutter/flutter-um-estudo-semanal-sobre-widgets-56g3"&gt;introdução&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Expaned
&lt;/h2&gt;

&lt;p&gt;O &lt;a href="https://www.youtube.com/watch?v=_rnZaagadyo&amp;amp;list=PLjxrf2q8roU23XGwz3Km7sQZFTdB996iG&amp;amp;index=3"&gt;video&lt;/a&gt; do Widget da semana postado no dia 21 de agosto de 2018, fala sobre Expanded.&lt;/p&gt;

&lt;p&gt;Esse widget é usado para organizar o espaço ocupado por itens em Rows, Columns e Flex. Ele faz com que esse item ocupe o espaço vago dentro do seu pai. &lt;/p&gt;

&lt;p&gt;Quando a renderização acontece, primeiro é construido os filhos que não são flexiveis e depois os que são flexíveis vão ser calculados com o espaço restante. &lt;/p&gt;

&lt;p&gt;Você pode pensar como se fosse um display flex no CSS, onde essa caixa vai se expandir ocupando o todo espaço restate ou então em uma proporção indicada.&lt;/p&gt;

&lt;p&gt;Como um exemplo de uso temos o código:&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="n"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nl"&gt;children:&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Widget&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;[&lt;/span&gt;
       &lt;span class="n"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
           &lt;span class="nl"&gt;color:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;black&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="nl"&gt;height:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="p"&gt;),&lt;/span&gt;
       &lt;span class="n"&gt;Expanded&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;Container&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;color:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;indigo&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
       &lt;span class="p"&gt;),&lt;/span&gt;
       &lt;span class="n"&gt;Expanded&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;Container&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;color:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pinkAccent&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;Que produz o segunte resultado:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vf6NFe77--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/8rrnmvux8f4e4dimft57.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vf6NFe77--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/8rrnmvux8f4e4dimft57.jpg" alt="Aplicativo com 3 retangulos, o primeiro sendo preto e menor e os restantes do mesmo tamanho, um azul e o outro rosa" width="590" height="1280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Você pode ver que sem indicar o tamanho ocupado pelos retangulos azul e rosa eles se organizaram baseado nas regras de expanded.&lt;br&gt;
Mas e se eu quiser que um seja de um tamanho diferente do outro?&lt;/p&gt;

&lt;p&gt;É so usar o atributo de flex e indicar a proporção de espaço a ser ocupado:&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="n"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nl"&gt;children:&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Widget&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;[&lt;/span&gt;
       &lt;span class="n"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
           &lt;span class="nl"&gt;color:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;black&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="nl"&gt;height:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="p"&gt;),&lt;/span&gt;
       &lt;span class="n"&gt;Expanded&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;Container&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;color:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;indigo&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
           &lt;span class="nl"&gt;flex:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="p"&gt;),&lt;/span&gt;
       &lt;span class="n"&gt;Expanded&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;Container&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;color:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pinkAccent&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;Assim obtemos o seginte resultado&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MX-MH0OE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/7rdtpz9gjgmfyp4f02pv.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MX-MH0OE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/7rdtpz9gjgmfyp4f02pv.jpg" alt="Aplicativo com 3 retangulos, o primeiro sendo preto e menor, os outros dois sendo de tamanhos diferentes, o segundo sendo o dobro de tamanho do terceiro, o maior tem cor azul e o menor tem cor rosa" width="590" height="1280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O retângulo azul com o flex de 2 esta tomando o dobro de espaço que o rosa (o valor default/padrão do flex é 1).&lt;/p&gt;

&lt;h2&gt;
  
  
  Sobre Nós
&lt;/h2&gt;

&lt;p&gt;Eu e o pessoal da Flutter Nation estamos em uma &lt;a href="https://www.facebook.com/FlutterNationBr/"&gt;página&lt;/a&gt; e um &lt;a href="https://www.facebook.com/groups/FlutterNation/"&gt;grupo&lt;/a&gt; no Facebook. &lt;br&gt;
Também estamos no &lt;a href="https://www.meetup.com/pt-BR/FlutterNation/"&gt;Meetup&lt;/a&gt; e no &lt;a href="https://github.com/Flutter-Nation"&gt;GitHub&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>google</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Um estudo sobre o Flutter FutureBuilder</title>
      <dc:creator>WellsSA</dc:creator>
      <pubDate>Fri, 13 Dec 2019 16:03:04 +0000</pubDate>
      <link>https://forem.com/flutterfans/um-estudo-sobre-o-flutter-futurebuilder-4g8n</link>
      <guid>https://forem.com/flutterfans/um-estudo-sobre-o-flutter-futurebuilder-4g8n</guid>
      <description>&lt;p&gt;Esse artigo faz parte de uma série chamada "Widgets da Semana", para saber mais sobre essa ela leia nossa &lt;a href="https://dev.to/flutter/flutter-um-estudo-semanal-sobre-widgets-56g3"&gt;introdução&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  FutureBuilder
&lt;/h2&gt;

&lt;p&gt;O &lt;a href="https://www.youtube.com/watch?v=ek8ZPdWj4Qo"&gt;video&lt;/a&gt; do Widget da semana postado no dia 18 de setembro de 2018 fala sobre o FutureBuilder.&lt;/p&gt;

&lt;p&gt;Quando falamos de arquitetura Web, requisições e etc é normal pensar em um cliente chamando um servidor. E nesse caminho mágico ocorrem uma série de coisas, mas o que importa para falarmos do FutureBuilder é: &lt;em&gt;sua requisição leva tempo!&lt;/em&gt; &lt;br&gt;
Ela pode levar de alguns milissegundos a vários segundos pra te retornar algo importante - e esse retorno ainda por cima pode ser um erro! :D   &lt;/p&gt;

&lt;p&gt;Pensando nisso, o FutureBuilder te permite lidar com esses percalços do mundo &lt;em&gt;assíncrono&lt;/em&gt; e dizer qual Widget deve ser renderizado de acordo com cada situação durante uma requisição. :O&lt;/p&gt;

&lt;p&gt;Assim, você pode fazer o seguinte fluxo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flutter, faça uma requisição pra &lt;a href="https://minha-poke-api.com"&gt;https://minha-poke-api.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Enquanto você espera, mostre pro usuário uma &lt;em&gt;barra de loading&lt;/em&gt; &lt;/li&gt;
&lt;li&gt;Se der bom, mostre uma &lt;em&gt;lista de pokemons&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Se der ruim, mostre um &lt;em&gt;widget dizendo "não foi dessa vez, meu consagrado"&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E pra isso acontecer, você só precisa usar o &lt;em&gt;FutureBuilder&lt;/em&gt;! Ele recebe, adivinha? Um &lt;em&gt;future&lt;/em&gt; e um &lt;em&gt;builder&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;FutureBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="ss"&gt;future: &lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'https://minha-poke-api.com'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="ss"&gt;builder: &lt;/span&gt;&lt;span class="p"&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;snapshot&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="o"&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;O &lt;em&gt;future&lt;/em&gt; recebe um processo assíncrono (não somente requisições) &lt;br&gt;
e o &lt;em&gt;builder&lt;/em&gt; recebe uma função que diz qual Widget deve ser construído.&lt;/p&gt;

&lt;p&gt;Na função passada ao &lt;em&gt;builder&lt;/em&gt; temos um: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;context&lt;/em&gt; que recebe um &lt;a href="https://api.flutter.dev/flutter/widgets/BuildContext-class.html"&gt;BuildContext&lt;/a&gt; (Que merece um artigo próprio e não precisaremos ver por hora).&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;snapshot&lt;/em&gt; do tipo &lt;a href="https://api.flutter.dev/flutter/widgets/AsyncSnapshot-class.html"&gt;AsyncSnapshot&lt;/a&gt; (Esse sim nos ajuda e muito na hora de tratar essas requisições!!)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O &lt;em&gt;AsyncSnapshot&lt;/em&gt; possui propriedades que nos ajudam - E MUITO - a entender o que está acontecendo durante a requisição e tratar isso, por exemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Saber se ocorreu algum erro (&lt;em&gt;hasError&lt;/em&gt;) ou se o retorno contém dados de fato (&lt;em&gt;hasData&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;Saber o estado atual do processo assíncrono, se ele foi concluído (&lt;em&gt;done&lt;/em&gt;), se ainda estamos aguardando um retorno (&lt;em&gt;waiting&lt;/em&gt;), se temos de fato um processo (&lt;em&gt;active&lt;/em&gt;) ou não (&lt;em&gt;none&lt;/em&gt;). E por aí vai.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sendo assim, podemos usar o &lt;em&gt;snapshot&lt;/em&gt; para tratar o fluxo que pretendemos fazer, por exemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quando a requisição for concluída, verificar se ela teve algum erro
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hasError&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sr"&gt;//&lt;/span&gt; &lt;span class="no"&gt;Deu&lt;/span&gt; &lt;span class="n"&gt;ruim&lt;/span&gt; &lt;span class="ss"&gt;:/&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="no"&gt;Podemos&lt;/span&gt; &lt;span class="n"&gt;pegar&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sr"&gt;//&lt;/span&gt; &lt;span class="no"&gt;Deu&lt;/span&gt; &lt;span class="n"&gt;bom!&lt;/span&gt; &lt;span class="ss"&gt;:D&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="no"&gt;Podemos&lt;/span&gt; &lt;span class="n"&gt;pegar&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;data&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Acompanhar o fluxo completo da requisição!!
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;    &lt;span class="n"&gt;switch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connectionState&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="no"&gt;ConnectionState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;none&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; 
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Aperte o botão para iniciar a requisição.'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="no"&gt;ConnectionState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;active&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; 
      &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="no"&gt;ConnectionState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;waiting&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Esperando requisição...'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="no"&gt;ConnectionState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Uhul, acabou!'&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;Agora sim, chega de enrolação! Prontos?&lt;/p&gt;
&lt;h3&gt;
  
  
  Mãos à obra
&lt;/h3&gt;

&lt;p&gt;FutureBuilder à postos&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;FutureBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="ss"&gt;future: &lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;builder: &lt;/span&gt;&lt;span class="p"&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;snapshot&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="o"&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;Enquanto a requisição não for concluída, mostramos nossa barra de loading&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;FutureBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="ss"&gt;future: &lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'https://minha-poke-api.com'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="ss"&gt;builder: &lt;/span&gt;&lt;span class="p"&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;snapshot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connectionState&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="no"&gt;ConnectionState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;done&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="o"&gt;...&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;CircularProgressIndicator&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;Assim que ela for concluída, vamos verificar se não ocorreu nenhum erro, claro!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;FutureBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="ss"&gt;future: &lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'https://minha-poke-api.com'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="ss"&gt;builder: &lt;/span&gt;&lt;span class="p"&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;snapshot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connectionState&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="no"&gt;ConnectionState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;done&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hasError&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="no"&gt;OurErrorIndicator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&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="o"&gt;...&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;CircularProgressIndicator&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;E, finalmente: vamos montar nossos pokemons!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;FutureBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="ss"&gt;future: &lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'https://minha-poke-api.com'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="ss"&gt;builder: &lt;/span&gt;&lt;span class="p"&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;snapshot&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connectionState&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="no"&gt;ConnectionState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;done&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hasError&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="no"&gt;OurErrorIndicator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&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="no"&gt;PokeListGenegator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;CircularProgressIndicator&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;Simples, prático e rápido. Esse é o FutureBuilder!&lt;/p&gt;

&lt;p&gt;Alguns projetos e palestras estão prestes a sair do forno e agora você já deu um passo pra acompanhar isso com muito mais facilidade!&lt;/p&gt;

&lt;p&gt;Se interessou? Cola com a &lt;a href="https://www.facebook.com/FlutterNationBr/"&gt;Flutter Nation&lt;/a&gt;: &lt;/p&gt;

&lt;h2&gt;
  
  
  Sobre Nós
&lt;/h2&gt;

&lt;p&gt;Eu e o pessoal da Flutter Nation estamos em uma &lt;a href="https://www.facebook.com/FlutterNationBr/"&gt;página&lt;/a&gt; e um &lt;a href="https://www.facebook.com/groups/FlutterNation/"&gt;grupo&lt;/a&gt; no Facebook. &lt;br&gt;
Também estamos no &lt;a href="https://www.meetup.com/pt-BR/FlutterNation/"&gt;Meetup&lt;/a&gt; e no &lt;a href="https://github.com/Flutter-Nation"&gt;GitHub&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>widgets</category>
      <category>google</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Um estudo sobre Flutter SafeArea</title>
      <dc:creator>Beatriz Herculano</dc:creator>
      <pubDate>Mon, 09 Dec 2019 17:59:03 +0000</pubDate>
      <link>https://forem.com/flutterfans/um-estudo-sobre-a-safearea-do-flutter-5cg4</link>
      <guid>https://forem.com/flutterfans/um-estudo-sobre-a-safearea-do-flutter-5cg4</guid>
      <description>&lt;p&gt;Esse artigo faz parte de uma série chamada "Widgets da Semana", para saber mais sobre essa ela leia nossa &lt;a href="https://dev.to/flutter/flutter-um-estudo-semanal-sobre-widgets-56g3"&gt;introdução&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  SafeArea
&lt;/h2&gt;

&lt;p&gt;O &lt;a href="https://www.youtube.com/watch?v=lkF0TQJO0bA&amp;amp;list=PLjxrf2q8roU23XGwz3Km7sQZFTdB996iG&amp;amp;index=2"&gt;video&lt;/a&gt; do Widget da semana postado no dia 14 de agosto de 2018, fala sobre a SafeArea. Esse widget inspeciona o modelo da tela do celular e ajusta a conteúdo para que ele fique formatado dentro dos limites.&lt;/p&gt;

&lt;p&gt;Não so o modelo/formato da tela é importante, mas como hoje aparecem varias notificações e também existem os recortes de tela, seu aplicativo pode ficar assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RjG68uSo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/2e770q6ef66ukboqqf7i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RjG68uSo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/2e770q6ef66ukboqqf7i.png" alt="Imagem simulando aplicativo que não se ajusta a tela de um celular com um recorte de tela e com pontas arredondadas" width="498" height="905"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para resolver esse tipo de incompatibilidade nós podemos usar o SafeArea.&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="n"&gt;SafeArea&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="c1"&gt;//Seus Widgets&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para entender a diferença entre usar ou não usar o SafeArea veja o exemplo a baixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--guXOgNZe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/czhy4ecm2hsnqmjns7or.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--guXOgNZe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/czhy4ecm2hsnqmjns7or.jpeg" alt="Captura de tela de um aplicativo onde o texto invade a barra de notificação" width="590" height="1280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse aplicativo tem o seguinte código:&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="n"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;color:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;white&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;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;'Esse texto invade a barra de notificação'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nl"&gt;style:&lt;/span&gt; &lt;span class="n"&gt;TextStyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;color:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;black&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;Sem usar a SafeArea o texto invade a barra de notificação e, ao olhar no celular, o texto é cortado pelo formato das pontas da tela que é arredondado.&lt;/p&gt;

&lt;p&gt;Se você apenas adicionar a SafeArea:&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="n"&gt;SafeArea&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;Container&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;color:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;white&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;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;'Esse texto nao invade a barra de notificação'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nl"&gt;style:&lt;/span&gt; &lt;span class="n"&gt;TextStyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;color:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;black&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;O resultado é bem melhor:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6vd0-x1F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/m9dgj9lbd5fa2tv1zsd3.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6vd0-x1F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/m9dgj9lbd5fa2tv1zsd3.jpeg" alt="Captura de tela de um aplicativo onde o texto não invade a barra de notificação" width="590" height="1280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Sobre Nós
&lt;/h2&gt;

&lt;p&gt;Eu e o pessoal da Flutter Nation estamos em uma &lt;a href="https://www.facebook.com/FlutterNationBr/"&gt;página&lt;/a&gt; e um &lt;a href="https://www.facebook.com/groups/FlutterNation/"&gt;grupo&lt;/a&gt; no Facebook. &lt;br&gt;
Também estamos no &lt;a href="https://www.meetup.com/pt-BR/FlutterNation/"&gt;Meetup&lt;/a&gt; e no &lt;a href="https://github.com/Flutter-Nation"&gt;GitHub&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>widget</category>
      <category>google</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Flutter - Um estudo semanal sobre Widgets</title>
      <dc:creator>Beatriz Herculano</dc:creator>
      <pubDate>Wed, 27 Nov 2019 16:36:22 +0000</pubDate>
      <link>https://forem.com/flutterfans/flutter-um-estudo-semanal-sobre-widgets-56g3</link>
      <guid>https://forem.com/flutterfans/flutter-um-estudo-semanal-sobre-widgets-56g3</guid>
      <description>&lt;h2&gt;
  
  
  Widget Of The Week - Videos legendados em português, mas a documentação esta em inglês
&lt;/h2&gt;

&lt;p&gt;O canal oficial do flutter no &lt;a href="https://www.youtube.com/channel/UCwXdFgeE9KYzlDdR7TG9cMw"&gt;youtube&lt;/a&gt; posta semanalmente um vídeo falando de diferentes Widgets e como eles são usados no desenvolvimento de apps com flutter.&lt;/p&gt;

&lt;p&gt;Os videos são curtos e super interessantes, porém no seu formato não passam tantas informações e referenciam a &lt;a href="https://flutter.dev/docs"&gt;documentação oficial do flutter&lt;/a&gt; como uma fonte mais aprofundada nos widgets e códigos.&lt;/p&gt;

&lt;p&gt;Com legendas em Português e varias outras línguas, esses videos são bem acessíveis, mas a documentação está apenas em inglês. Barrando varias pessoas a procurarem a fundo sobre esses widgets e sobre o Flutter.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que nos vamos fazer? Um Artigo por semana sobre um dos Widgets!
&lt;/h2&gt;

&lt;p&gt;Então nós, pessoas apaixonadas por flutter e com tempo sobrando, decidimos aumentar o alcance de informações sobre o flutter e seus Widgets da semana.&lt;/p&gt;

&lt;p&gt;Nós vamos criar um artigo para cada widget da semana lançado e pros que vão lançar. Sabemos que será um desafio, já que até o dia atual já foram lançados 60 videos nesse formato, mas nossa força de vontade nos cega e nos guia.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sobre quais Widgets nos vamos escrever?
&lt;/h2&gt;

&lt;p&gt;Segue a lista de Widgets da semana, essa lista será atualizada conforme mais videos e artigos forem lançados:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/flutterfans/um-estudo-sobre-a-safearea-do-flutter-5cg4"&gt;SafeArea&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/flutterfans/um-estudo-sobre-flutter-expanded-36jc"&gt;Expanded&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Wrap&lt;/li&gt;
&lt;li&gt;AnimatedContainer&lt;/li&gt;
&lt;li&gt;Opacity&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/flutterfans/um-estudo-sobre-o-flutter-futurebuilder-4g8n"&gt;FutureBuilder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;FadeTransition&lt;/li&gt;
&lt;li&gt;FloatingActionButton&lt;/li&gt;
&lt;li&gt;PageView&lt;/li&gt;
&lt;li&gt;Table&lt;/li&gt;
&lt;li&gt;SliverAppBar&lt;/li&gt;
&lt;li&gt;SliverList e SliverGrid&lt;/li&gt;
&lt;li&gt;FadeInImage&lt;/li&gt;
&lt;li&gt;StreamBuilder&lt;/li&gt;
&lt;li&gt;InheritedModel&lt;/li&gt;
&lt;li&gt;ClipRRect&lt;/li&gt;
&lt;li&gt;Hero&lt;/li&gt;
&lt;li&gt;CustomPaint&lt;/li&gt;
&lt;li&gt;Tooltip&lt;/li&gt;
&lt;li&gt;FittedBox &lt;/li&gt;
&lt;li&gt;LayoutBuilder &lt;/li&gt;
&lt;li&gt;AbsorbPointer &lt;/li&gt;
&lt;li&gt;Transform&lt;/li&gt;
&lt;li&gt;BackdropFilter&lt;/li&gt;
&lt;li&gt;Align&lt;/li&gt;
&lt;li&gt;Positioned&lt;/li&gt;
&lt;li&gt;AnimatedBuilder &lt;/li&gt;
&lt;li&gt;Dismissible&lt;/li&gt;
&lt;li&gt;SizedBox&lt;/li&gt;
&lt;li&gt;ValueListenableBuilder&lt;/li&gt;
&lt;li&gt;Draggable &lt;/li&gt;
&lt;li&gt;Flexible &lt;/li&gt;
&lt;li&gt;MediaQuery &lt;/li&gt;
&lt;li&gt;Spacer &lt;/li&gt;
&lt;li&gt;InheritedWidget &lt;/li&gt;
&lt;li&gt;AnimatedIcon&lt;/li&gt;
&lt;li&gt;AspectRatio &lt;/li&gt;
&lt;li&gt;LimitedBox &lt;/li&gt;
&lt;li&gt;Placeholder &lt;/li&gt;
&lt;li&gt;RichText &lt;/li&gt;
&lt;li&gt;ReorderableListView &lt;/li&gt;
&lt;li&gt;AnimatedSwitcher&lt;/li&gt;
&lt;li&gt;AnimatedPositioned &lt;/li&gt;
&lt;li&gt;AnimatedPadding&lt;/li&gt;
&lt;li&gt;IndexedStack &lt;/li&gt;
&lt;li&gt;Semantics&lt;/li&gt;
&lt;li&gt;ConstrainedBox&lt;/li&gt;
&lt;li&gt;Stack &lt;/li&gt;
&lt;li&gt;AnimatedOpacity&lt;/li&gt;
&lt;li&gt;FractionallySizedBox &lt;/li&gt;
&lt;li&gt;ListView &lt;/li&gt;
&lt;li&gt;ListTile &lt;/li&gt;
&lt;li&gt;Container &lt;/li&gt;
&lt;li&gt;SelectableText&lt;/li&gt;
&lt;li&gt;DataTable&lt;/li&gt;
&lt;li&gt;Slider, RangeSlider e CupertinoSlider&lt;/li&gt;
&lt;li&gt;AlertDialog&lt;/li&gt;
&lt;li&gt;AnimatedCrossFade&lt;/li&gt;
&lt;li&gt;DraggableScrollableSheet &lt;/li&gt;
&lt;li&gt;ColorFiltered&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sobre Nós
&lt;/h2&gt;

&lt;p&gt;Eu e o pessoal da Flutter Nation estamos em uma &lt;a href="https://www.facebook.com/FlutterNationBr/"&gt;página&lt;/a&gt; e um &lt;a href="https://www.facebook.com/groups/FlutterNation/"&gt;grupo&lt;/a&gt; no Facebook. &lt;br&gt;
Também estamos no &lt;a href="https://www.meetup.com/pt-BR/FlutterNation/"&gt;Meetup&lt;/a&gt; e no &lt;a href="https://github.com/Flutter-Nation"&gt;GitHub&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>widgets</category>
      <category>google</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Instalando Flutter no Windows</title>
      <dc:creator>Jonatas Santos</dc:creator>
      <pubDate>Thu, 19 Sep 2019 16:49:09 +0000</pubDate>
      <link>https://forem.com/flutterfans/instalando-o-flutter-no-windows-2aj4</link>
      <guid>https://forem.com/flutterfans/instalando-o-flutter-no-windows-2aj4</guid>
      <description>&lt;p&gt;Olá meus queridos, sejam todos bem vindos a está saga sobre Flutter,onde iremos abordar desde á instalação até o desenvolvimento de Apps.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Então vamos nessa&lt;/b&gt;&lt;br&gt;
Primeiro vamos conheçer um pouco sobre o Flutter e em seguida iremos iniciar a instalação do SDK no anbiemte Windows.&lt;/p&gt;

&lt;p&gt;O Flutter é um SDK open-source da Google para o desenvolvimento de aplicativos nativos para iOS e Android, também é o principal método de criação de apps para o Google Fuchsia (novo sistema operacional em desenvolvimento que pretende substituir o Android).&lt;br&gt;
Neste artigo, veremos o passo a passo da instalação do Flutter no Windows, para que possamos começar a brincar e construir nossos primeiros apps.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Pré-requisitos&lt;/b&gt;&lt;br&gt;
Para instalar o flutter no Windows, você precisar ter uma maquina com os seguintes requisitos:&lt;br&gt;
Sistema operacional Windows 7 SP1 ou mais atual na versão 64bits.&lt;br&gt;
400 MB de espaço em disco para a instalação do SDK.&lt;br&gt;
Windows PowerShell 5.0 ou mais recente.&lt;br&gt;
Git for Windows versão 2.0 ou superior.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Instalando o SDK&lt;/b&gt;&lt;br&gt;
&lt;b&gt;1º passo:&lt;/b&gt; Baixe o SDK do Flutter e extraia-o.&lt;br&gt;
&lt;a href="https://flutter.dev/docs/get-started/install/windows" rel="noopener noreferrer"&gt;Download&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;2º passo:&lt;/b&gt; Extraia o arquivo baixado e coloque a pasta “flutter” no diretório de sua preferencia, ex.: C:\src\flutter. A documentação não aconselha instalar o Flutter em um diretório como C:\Program Files\ para evitar problemas com falta de permissão.&lt;br&gt;
Após esse passo, já é possível acessar o comando flutter e todos os comandos disponíveis executando o arquivo “flutter_console.bat”. Você também pode acessar o Flutter à partir de qualquer terminal ou prompt de comando.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FCVpD2rI.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FCVpD2rI.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;3º passo:&lt;/b&gt; Adicione o Flutter à variável PATH do sistema. Para tal, copie o caminho até o diretório \bin, existente na pasta “flutter”. No Windows Explorer, clique com o botão direito em “Este computador” e acesse a opção “Propriedades”. Em seguida vá em “Configurações avançadas do sistema” → “Variáveis de ambiente”. No text field “Variáveis de usuário”, clique na variável PATH → “Novo”, e cole o caminho para o diretório \bin.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FGJqq9BC.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FGJqq9BC.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Instalando dependências&lt;/b&gt;&lt;br&gt;
Agora que o SDK está instalado e o Flutter foi adicionado à variável de ambiente PATH, podemos utilizar o comando &lt;b&gt;flutter doctor&lt;/b&gt; em qualquer terminal.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FFSjLLAv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FFSjLLAv.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O &lt;b&gt;flutter doctor&lt;/b&gt; é o comando responsável por verificar se existem dependências do Flutter a serem instaladas. Além disso, ele retorna um relatório (Doctor Summary) sobre o status da instalação contendo as dependências que faltam, como instalá-las, problemas encontrados e como resolvê-los.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Instalando o Android Studio&lt;/b&gt;&lt;br&gt;
Para instalar o Android Studio acesse esse &lt;a href="https://developer.android.com/studio/" rel="noopener noreferrer"&gt;link&lt;/a&gt;, baixe e instale a versão mais recente. A instalação é bem simples e direta, do tipo “Next-Next-Finish”.&lt;/p&gt;

&lt;p&gt;Ao concluir o processo de instalação e utilizar o comando novamente, o Doctor Summary trará outra mensagem, informando que há licenças do Android que não foram aceitas. Para resolver isso, utilize o comando: flutter doctor --android-licenses e aceite todas as licenças digitando “y” no console para todas as opções.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F1%252Ajz38rMbRI2p8lVRyaUKMqQ.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fcdn-images-1.medium.com%2Fmax%2F800%2F1%252Ajz38rMbRI2p8lVRyaUKMqQ.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Testando a instalação&lt;/b&gt;&lt;br&gt;
Agora chegou a parte onde iremos começar os testes, vamos criar um projeto, compilá-lo e executá-lo. Para tanto, assegure que há um dispositivo conectado ao computador, e que as opções de desenvolvedor foram ativadas nele . Em seguida, digite o comando flutter create , para criar um novo projeto, e entre na pasta criada.&lt;/p&gt;

&lt;p&gt;Agora execute o comando:&lt;b&gt;flutter run&lt;/b&gt; dentro pasta onde foi criado o projeto, e aceite a instalação no seu dispositivo para que seja possível compilar e executar o projeto da imagem abaixo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FNvwvMDj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2FNvwvMDj.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora só alegria pois o Flutter está instalado e configurado corretamente.&lt;br&gt;
Agora já podemos começar a brincar.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Alguns comando essenciais: &lt;/b&gt;&lt;br&gt;
&lt;b&gt;flutter create =&lt;/b&gt; cria um novo projeto com toda a estrutura padrão de pastas, código boilerplate e testes.&lt;br&gt;
&lt;b&gt;flutter run =&lt;/b&gt; compila e dá build no projeto.&lt;br&gt;
&lt;b&gt;flutter run -d  =&lt;/b&gt; compila e dá build em um dispositivo específico.&lt;br&gt;
&lt;b&gt;flutter install =&lt;/b&gt; instala o projeto Flutter no dispositivo conectado.&lt;br&gt;
&lt;b&gt;flutter packages get =&lt;/b&gt; adiciona dependências ao projeto.&lt;br&gt;
&lt;b&gt;flutter test =&lt;/b&gt; executa teste unitário.&lt;br&gt;
&lt;b&gt;flutter doctor =&lt;/b&gt; mostra informações do processo de instalação do Flutter.&lt;br&gt;
&lt;b&gt;flutter devices =&lt;/b&gt; lista todos os dispositivos conectados, com informações como: nome do dispositivo, id do dispositivo e versão do Android .&lt;br&gt;
&lt;b&gt;s =&lt;/b&gt; realiza uma captura de tela do aplicativo em execução e a armazena na pasta do projeto.&lt;br&gt;
&lt;b&gt;r =&lt;/b&gt; realiza hot reload do projeto.&lt;br&gt;
&lt;b&gt;shift + r =&lt;/b&gt; realiza hot restart do projeto.&lt;br&gt;
&lt;b&gt;q =&lt;/b&gt; encerra o projeto.&lt;br&gt;
&lt;b&gt;flutter help =&lt;/b&gt; lista estes e todos os outros comandos disponíveis para serem executados com Flutter.&lt;/p&gt;

</description>
      <category>dart</category>
      <category>flutter</category>
      <category>google</category>
      <category>development</category>
    </item>
    <item>
      <title>Iniciando com Flutter: Widgets</title>
      <dc:creator>Beatriz Herculano</dc:creator>
      <pubDate>Thu, 12 Sep 2019 18:31:15 +0000</pubDate>
      <link>https://forem.com/flutterfans/iniciando-com-flutter-widgets-3o7m</link>
      <guid>https://forem.com/flutterfans/iniciando-com-flutter-widgets-3o7m</guid>
      <description>&lt;h2&gt;
  
  
  Introdução
&lt;/h2&gt;

&lt;h4&gt;
  
  
  O que é flutter?
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://dev.to/flutter/o-que-e-o-flutter-e-dart-e25"&gt;Flutter é um SDK para desenvolvimento de aplicativos multiplataforma e aplicações web criada pela Google.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Eu comecei estudando flutter sem nunca ter programado com componentes, então vários conceitos eram estranhos para mim, o principal foi o conceito e uso de Widgets.&lt;/p&gt;

&lt;p&gt;Ao ler a &lt;a href="https://flutter.dev/docs/development/ui/widgets-intro"&gt;documentação do flutter&lt;/a&gt;, me deparei com a seguinte definição de widget:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Widgets describe what their view should look like given their current configuration and state. When a widget’s state changes, the widget rebuilds its description, which the framework diffs against the previous description in order to determine the minimal changes needed in the underlying render tree to transition from one state to the next.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Em uma tradução livre: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Widgets são estruturas que descrevem como a sua visualização deve ser, conforme o sua configuração e estado atual. Quando o estado de um widget muda, o ele reconstrói sua descrição, a qual o framework compara com a diferença da descrição anterior, para determinar as mudanças mínimas na árvore de renderização ao transitar de um estado para outro.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O trecho traz o conceito de widget, porém não traz a informação de como ele é usado para a construção do app em flutter.&lt;/p&gt;

&lt;p&gt;O objetivo desse artigo é trazer de forma clara o conceito de widgets, sejam eles imutáveis ou mutáveis. E passar uma visão do que é construir um aplicativo em flutter usando eles.&lt;/p&gt;

&lt;h1&gt;
  
  
  Árvore de Renderização
&lt;/h1&gt;

&lt;p&gt;A primeira coisa para se entender é que todo item visual em um app em flutter é um widget dentro do outro:&lt;br&gt;
Se eu quiser um texto centralizado eu coloco um widget Text dentro de um Center. Inclusive, seu app em si vai ser um Widget com outros dentro dele.&lt;/p&gt;

&lt;p&gt;Quando o Widget exterior tem seu estado modificado, ele reconstrói os Widgets interiores a ele, ou seja, sua árvore de renderização.&lt;/p&gt;
&lt;h1&gt;
  
  
  Imutáveis
&lt;/h1&gt;

&lt;p&gt;Chamados de “StatelessWidgets” é um objeto que se constrói uma vez e não tem informações de como se reconstruir. Então ele não vai afetar a sua árvore de renderização.&lt;/p&gt;

&lt;p&gt;Um exemplo de um widget imutável ou Stateless é o Text. Ele é um widget que recebe um parâmetro string/texto e monta um objeto visual onde esse valor é transformado em uma label e exibido na tela.&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="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s"&gt;'Esse é um texto imutável'&lt;/span&gt;&lt;span class="p"&gt;,);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ele, por si só nunca muda seu texto sozinho, se ele foi construído uma vez, ele não tem capacidade de se reconstruir com um valor de texto novo.&lt;/p&gt;

&lt;h1&gt;
  
  
  Mutáveis
&lt;/h1&gt;

&lt;p&gt;O chamado de “StatefulWidget” é um objeto que tem objeto de State. Esse objeto representa situação atual do widget, que pode ser modificada conforme o tempo ou conforme coisas acontecem no seu app. Esse estado sabe se reconstruir, afetando todos os Widgets dentro dele, ou seja, sua árvore de renderização.&lt;/p&gt;

&lt;p&gt;Se eu tenho um aplicativo onde um botão é clicado para mudar o valor do Widget, deve ser indicado que o estado dele mudou, usando o método setState. Assim nos forçamos o objeto a se reconstruir e, também, a todos os Widgets que tem dentro dele, inclusive os imutáveis. Se você quiser saber mais em como o setState afeta o desempenho do app veja a &lt;a href="https://flutter.dev/docs/testing/best-practices"&gt;documentação&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Você pode entender melhor com o exemplo:&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;Counter&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatefulWidget&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;_CounterState&lt;/span&gt; &lt;span class="n"&gt;createState&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_CounterState&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;_CounterState&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;_counter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;_incrementCounter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;_counter&lt;/span&gt;&lt;span class="o"&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;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;Container&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;Center&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;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nl"&gt;mainAxisAlignment:&lt;/span&gt; &lt;span class="n"&gt;MainAxisAlignment&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;center&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="nl"&gt;children:&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Widget&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;[&lt;/span&gt;
            &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
              &lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="si"&gt;$_counter&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="nl"&gt;style:&lt;/span&gt; &lt;span class="n"&gt;Theme&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;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;textTheme&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;display1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="n"&gt;FloatingActionButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
              &lt;span class="nl"&gt;onPressed:&lt;/span&gt; &lt;span class="n"&gt;_incrementCounter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="nl"&gt;tooltip:&lt;/span&gt; &lt;span class="s"&gt;'Increment'&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;Icon&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Icons&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="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;span class="nl"&gt;color:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;white&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;Nos temos um StatefulWidget que tem tem uma variável int, um objeto Text e um botão. Quando eu clico no botão a eu somo 1 ao meu número, e sinalizo que o estado do meu widget foi modificado, usando o setState. Assim ele força e reconstrução do meu objeto Text dentro dele com o novo valor do meu número.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusão
&lt;/h1&gt;

&lt;p&gt;No final, construir um app em flutter é usar  StatefulWidgets que forçam a reconstrução de StatelessWidgets.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Meus agradecimento a Filipe Pereira, um grande amigo.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>google</category>
      <category>dart</category>
      <category>development</category>
    </item>
    <item>
      <title>O que é o Flutter e Dart</title>
      <dc:creator>Telles (@UnicornCoder)</dc:creator>
      <pubDate>Sun, 01 Sep 2019 11:58:38 +0000</pubDate>
      <link>https://forem.com/flutterfans/o-que-e-o-flutter-e-dart-e25</link>
      <guid>https://forem.com/flutterfans/o-que-e-o-flutter-e-dart-e25</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IqaO4PtK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/dw3ywov879915vzzn7aw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IqaO4PtK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/dw3ywov879915vzzn7aw.png" alt="Intro" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mas afinal o que é o Flutter?&lt;/strong&gt;&lt;br&gt;
Flutter é um SDK para desenvolvimento de aplicativos multiplataforma e aplicações web, criada pela Google, a ferramenta tem o seguinte princípio:&lt;/p&gt;

&lt;p&gt;Desempenho: o app desenvolvido tem performance de app nativo;&lt;br&gt;
UI rica e nativa, com experiência do usuário natural de cada plataforma;&lt;br&gt;
Desenvolvimento rápido por meio do uso de widgets e do hot reload (aquele lance de atualizar a aplicação quando você salva seu código no editor e já poder testar as alterações).&lt;/p&gt;

&lt;p&gt;A primeira versão do Flutter foi lançada em maio de 2017 e atualmente (2019), está na versão 1.7 com recursos para desenvolvimento Web.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;O Flutter é dividido em duas camadas principais:&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Engine, escrita em C/C++ e responsável pela estrutura de execução. Ela é composta pela &lt;a href="https://skia.org/"&gt;Skia&lt;/a&gt;, uma biblioteca de renderização 2D e de texto, e pelo Dart, que é a linguagem utilizada no desenvolvimento;&lt;/p&gt;

&lt;p&gt;Framework, utilizando a linguagem &lt;a href="https://dart.dev"&gt;Dart&lt;/a&gt;, é onde criamos a implementação das Widgets da nossa aplicação. &lt;br&gt;
Ele é responsável pelos componentes visuais, incluindo aqueles específicos para Android e para iOS, além da renderização de layouts responsivos.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Mas afinal porquê o Dart?&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Dart é uma linguagem de programação apresentada pelo Google, em 2011, com o objetivo de substituir o JavaScript como principal linguagem embutida nos navegadores. &lt;/p&gt;

&lt;p&gt;É possível citar como algumas de suas características o fato de ser orientada a objetos, declarativa, mantida majoritariamente pelo Google e por ser tipada. Além disso, o que foi o mais importante e decisivo na escolha dessa linguagem para Flutter é que ela pode ser compilada em ahead-of-time e just-in-time.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;O Dart é AOT (Ahead Of Time) compilado em código nativo rápido, previsível, que permite que quase todo o Flutter seja escrito no Dart. Isso não apenas torna o Flutter rápido, praticamente tudo (incluindo todos os widgets) pode ser personalizado.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;O Dart também pode ser compilado com JIT (Just In Time) para ciclos de desenvolvimento excepcionalmente rápidos e fluxo de trabalho que muda o estado (incluindo a popular sub-second stateful hot reload do Flutter).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se você ja é familiarizado com o TypeScript ou até mesmo Java e/ou .net você vai lidar facilmente com o Dart, porque ele é uma linguagem tipada como disse aqui em cima além de trabalhamos com Classes, Async/await.&lt;/p&gt;

&lt;p&gt;E tipar seus dados pode te ajudar muito na hora do desenvolvimento porque você sabe realmente o dado que entra e que sai para cada método que vai criar. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Vamos falar mais das particularidades do Dart nos próximos artigos, não se preocupe.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Agora que você já sabe o que é o Flutter e o Dart já podemos ir mais a fundo com nossos artigos e entender mais do que essa linguagem/framework pode nos oferecer.&lt;/p&gt;

&lt;p&gt;Nos vemos nos próximos artigos!&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>google</category>
      <category>dart</category>
      <category>development</category>
    </item>
  </channel>
</rss>
