<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Flutter - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Aprenda a codificar - de graça. Tutoriais de programação em Python, JavaScript, Linux e muito mais. ]]>
        </description>
        <link>https://www.freecodecamp.org/portuguese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Flutter - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Wed, 06 May 2026 19:56:28 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/tag/flutter/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Como aprender Flutter ]]>
                </title>
                <description>
                    <![CDATA[ O Flutter é uma tendência em tecnologia. Este artigo vai sugerir algumas formas gratuitas e pagas de como aprender a desenvolver aplicações do iOS e do Android com Flutter. Você tem interesse em desenvolvimento de aplicações para dispositivos móveis? Se a sua resposta é sim, você está lendo o artigo ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-aprender-flutter/</link>
                <guid isPermaLink="false">63e1a17a043d830559f4120c</guid>
                
                    <category>
                        <![CDATA[ Flutter ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Arthur Fücher ]]>
                </dc:creator>
                <pubDate>Mon, 27 Mar 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/03/how-to-learn-flutter-in-2020.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-learn-flutter-in-2020/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Learn Flutter in 2020</a>
      </p><p>O Flutter é uma tendência em tecnologia. Este artigo vai sugerir algumas formas gratuitas e pagas de como aprender a desenvolver aplicações do iOS e do Android com Flutter.</p><h2 id="voc-tem-interesse-em-desenvolvimento-de-aplica-es-para-dispositivos-m-veis"><strong>Você tem interesse em desenvolvimento de aplicações para dispositivos móveis?</strong></h2><p>Se a sua resposta é sim, você está lendo o artigo correto! Talvez você não conheça sobre Flutter ainda, mas não se preocupe – eu escrevi um artigo sobre o que o Flutter é e por que você deveria aprender sobre ele.</p><blockquote>O Flutter é um framework de interface gratuito e de código aberto criado pelo Google e lançado em maio de 2017. Em poucas palavras, ele permite que você crie aplicações móveis nativas com um único código. Isso significa que você pode usar uma linguagem de programação e uma base de código para criar duas aplicações diferentes (para iOS e para Android). – <a href="https://herewecode.io/blog/what-is-flutter-and-why-you-should-learn-it-in-2020/">What is Flutter and Why You Should Learn It in 2020</a> (em inglês)</blockquote><p>Neste texto, eu compartilho com você dois tipos de conteúdo, gratuito e pago. Eu tentei achar recursos excelentes para apoiar cada tipo de aluno (vídeos, cursos, livros, tutoriais e assim por diante).</p><p>Antes de começarmos, eu também escrevi <a href="https://herewecode.io/blog/should-you-learn-programming-with-paid-or-free-content-and-why/">um artigo sobre como e por que aprender a programar com conteúdo pago ou gratuito</a> (em inglês). Se você não sabe que tipo de conteúdo é melhor para você, eu recomendo que você leia esse artigo antes de ler este.</p><p>Então, vamos começar. Eu tentei explicar cada recurso com um pequeno parágrafo. Todas as informações vieram da descrição do site associado. Como você pode imaginar, eu não tentei todos esses métodos. Se precisar de mais detalhes, eu convido você a visitar o site vinculado.</p><h2 id="conte-do-gratuito"><strong>Conteúdo gratuito</strong></h2><h3 id="v-deos-cursos"><strong>Vídeos/cursos</strong></h3><ul><li><a href="https://www.youtube.com/watch?v=Ej_Pcr4uC2Q">Dart Programming Tutorial - Full Course</a> (em inglês) </li></ul><p>Um curso completo do freeCodeCamp sobre Dart.</p><blockquote>Aprenda a linguagem de programação Dart neste tutorial completo para iniciantes. O Dart é uma linguagem de programação fortemente tipada que é usada no framework Flutter para desenvolvimento de aplicações para dispositivos móveis multiplataforma.</blockquote><ul><li><a href="https://www.youtube.com/watch?v=pTJJsmejUOQ">Flutter Course - Full Tutorial for Beginners (Build iOS and Android Apps)</a> (em inglês)</li></ul><p>Um tutorial completo do freeCodeCamp para iniciantes. Este tutorial foi uma das minhas referências quando comecei com Flutter. É uma excelente introdução e ajuda você a entender os conceitos básicos que serão úteis para você.</p><blockquote>Aprenda Flutter, o framework de desenvolvimento multiplataforma para dispositivos móveis inovador do Google, para criar aplicações para Android e iOS. Neste curso, Nick Manning do <a href="https://fluttercrashcourse.com/">FlutterCrashCourse</a> ensina como começar a usar o Flutter de maneira rápida e eficaz. Nick é engenheiro do Flutter desde 2017 e resumiu esse conhecimento do mundo real em um curso intensivo direto, realista e passo a passo.</blockquote><ul><li><a href="https://www.youtube.com/watch?v=1gDhl4leEzA&amp;feature=youtu.be">Flutter Crash Course</a> (em inglês)</li></ul><p>Curso intensivo de Flutter, da Traversy Media.</p><blockquote>Neste curso intensivo, vamos ver Flutter para a construção de aplicações para dispositivos móveis nativas. Veremos o que é o Flutter, como configurá-lo, construir widgets, widgets stateless e stateful, roteamento e mais.</blockquote><ul><li><a href="https://www.youtube.com/playlist?list=PL4cUxeGkcC9jLYyp2Aoh6hcWuxFDX6PBJ">Flutter Tutorial for Beginners</a> (em inglês)</li></ul><p>Uma lista de vídeos do YouTube sobre Flutter para iniciantes criada por The Net Ninja.</p><blockquote>Você vai descobrir como usar o Flutter (e o Dart) para criar aplicações para Android e iOS do zero. Você vai aprender tudo sobre widgets, pacotes, assets e código assíncrono para criar a aplicação de Horário Mundial (World Time), assim como outras duas miniaplicações para colocar suas habilidades de Flutter em bom uso!</blockquote><ul><li><a href="https://www.youtube.com/playlist?list=PL4cUxeGkcC9j--TKIdkb3ISfRbJeJYQwC">Flutter &amp; Firebase App Build</a> (em inglês)</li></ul><p>Uma lista de vídeos do YouTube sobre Flutter e Firebase criada por The Net Ninja. Quando eu quis usar Firebase na minha primeira aplicação, eu fiz este curso pela primeira vez. Ele era amplo e me deu um bom entendimento sobre como integrar essa ferramenta com o Flutter.</p><blockquote>Você vai aprender como criar uma aplicação em Flutter do zero, usando o Firebase Firestore (um banco de dados sincronizado em tempo real) e a Firebase Authentication. Essa lista é para pessoas que já sabem Flutter.</blockquote><ul><li><a href="https://www.youtube.com/channel/UCSIvrn68cUk8CS8MbtBmBkA/featured">Reso Coder</a> (em inglês)</li></ul><p>Um canal no YouTube dedicado ao Flutter. Reso Coder criou diversos tutoriais explicando como o <em>framework </em>funciona. Diversas ferramentas que você pode usar com Flutter são explicadas para que você possa integrá-las ao seu projeto. Existem inclusive lições sobre arquitetura de código para Flutter.</p><blockquote>O Flutter está mudando a cena do desenvolvimento de aplicações. Não fique para trás! Aprenda como desenvolver para multiplataformas móveis e para a web. Aprenda através de lições orientadas a projetos cuidadosamente elaboradas e aplique imediatamente o que aprender nas suas próprias aplicações.</blockquote><ul><li><a href="https://www.youtube.com/channel/UC2d0BYlqQCdF9lJfydl_02Q/featured">FilledStacks</a> (em inglês)</li></ul><p>Um canal do YouTube dedicado ao Flutter. Você descobrirá diversos tutoriais sobre Flutter, como por exemplo Firebase, interfaces (UI), arquitetura e outros. Também existem aulas de Flutter para celular e para a web.</p><blockquote>Aprenda a criar aplicações para dispositivos móveis de alta qualidade e prontas para produção usando o Flutter.</blockquote><ul><li><a href="https://www.youtube.com/c/CodeWithAndrea">Code With Andrea</a> (em inglês)</li></ul><blockquote>Tutoriais sobre aprender Flutter. Vídeos regulares cobrindo todas as coisas relacionadas ao Flutter, incluindo gerenciamento de estado, leiautes, testes, e mais. Este canal vai ajudar você a se tornar melhor em Flutter.</blockquote><h3 id="google-codelabs"><strong>Google Codelabs</strong></h3><p>Você também pode aprender Flutter com o site <a href="https://codelabs.developers.google.com/?cat=Flutter">Google Codelabs</a>. O site fornece uma experiência prática de programação, baseada em tutoriais. Eu acabo de descobrir este site. Você pode até usá-lo para outras coisas além do Flutter. Ele faz referência a todas as tecnologias do Google com muitos tutoriais para ajudar você a usá-las.</p><blockquote>A maior parte dos codelabs (tutoriais da plataforma) guiarão você em um processo de criar uma pequena aplicação ou adicionar uma nova funcionalidade a uma aplicação existente. Eles cobrem uma grande variedade de tópicos como Android Wear, Google Compute Engine, Projeto Tango e Google APIs no iOS.</blockquote><h3 id="documenta-o"><strong>Documentação</strong></h3><p>Uma coisa que eu adoro no Flutter é a <a href="https://flutter.dev/docs">documentação</a> (em inglês). Ela é completa e pode ser muito útil enquanto você está aprendendo ou desenvolvendo uma aplicação.</p><p>A documentação passa por vários tópicos como:</p><ul><li>Como começar com Flutter</li><li>Todas as widgets disponíveis</li><li>Documentação da API (documentação de bibliotecas)</li><li>Um guia passo a passo com diversos tutoriais</li><li>Alguns exemplos de aplicações</li><li>O canal do Flutter no YouTube</li></ul><h3 id="livros"><strong>Livros</strong></h3><ul><li><a href="https://www.syncfusion.com/ebooks/flutter-succinctly">Flutter Succinctly</a> (em inglês)</li></ul><p>Pesquisando na documentação do Flutter, eu achei este livro. O autor cria uma aplicação completamente funcional, que permite entender claramente o <em>framework</em>. Esse livro é acessível independentemente de você ter ou não a experiência com desenvolvimento móvel.</p><ul><li><a href="https://kodestat.gitbook.io/flutter/">Flutter Tutorials Handbook</a> (em inglês)</li></ul><p>Este livro contém receitas que demonstram como solucionar problemas comuns enquanto se escreve aplicações com o Flutter. Cada método é individual e pode ser usado como referência para ajudar a construir uma aplicação. Pode ser usado em adição à documentação do Flutter. Diversos exemplos são listados aqui.</p><h3 id="herewecode"><strong>HereWeCode</strong></h3><p>Eu planejo criar tutoriais de Flutter em breve. Para ficar sabendo, você pode me seguir no meu <a href="https://www.youtube.com/channel/UCSRuzHhjUaAnBb6_rmlr10g">canal do Youtube</a> e no <a href="https://twitter.com/gaelgthomas/">Twitter</a>. Fique à vontade para me falar quais tópicos e tutoriais você quer ver.</p><h2 id="conte-do-pago"><strong>Conteúdo pago</strong></h2><h3 id="cursos"><strong>Cursos</strong></h3><ul><li><a href="https://www.udemy.com/course/flutter-bootcamp-with-dart/">The Complete 2020 Flutter Development Bootcamp with Dart</a> (em inglês)</li></ul><blockquote>Este Bootcamp de Flutter foi criado oficialmente com a colaboração do time de Flutter do Google. Você vai aprender do zero e criar algumas aplicações. O curso inclui mais de 27 horas de tutoriais em vídeo e projetos. Mesmo que tenha zero de experiência com programação, você pode começar aqui.</blockquote><ul><li><a href="https://www.udemy.com/course/learn-flutter-dart-to-build-ios-android-apps/">Learn Flutter &amp; Dart to Build iOS &amp; Android Apps [2020]</a> (em inglês)</li></ul><blockquote>Um guia completo sobre o SDK do Flutter e o sobre o framework do Flutter para criar aplicações nativas para iOS e Android. Conhecimento básico em linguagem de programação ajuda, mas não é obrigatório. Com este curso, você aprenderá Flutter não somente na teoria, mas também construindo uma aplicação completa e realista. Ela usará recursos como o Google Maps, câmera, animações e mais.</blockquote><ul><li><a href="https://www.udemy.com/course/dart-and-flutter-the-complete-developers-guide/?ranMID=39197&amp;ranEAID=R7BSs79ua1Y&amp;ranSiteID=R7BSs79ua1Y-SpCxrCZ5bX.j71JLQLZ2Bg&amp;LSNPUBID=R7BSs79ua1Y">Dart and Flutter: The Complete Developer's Guide</a> (em inglês)</li></ul><blockquote>Tudo o que você precisa saber para construir aplicações para dispositivos móveis com Flutter e Dart, incluindo RxDart e animações! Experiência prévia com JavaScript, Java, Python ou similar é requerida. Neste curso, você vai entender como projetar, criar animações e arquitetura de uma aplicação com Flutter. Este curso parece ser mais avançado que outros. Você vai aprender habilidades como usar o armazenamento off-line, otimizar solicitações de rede, usar padrões de design avançados, e mais.</blockquote><ul><li><a href="https://www.udemy.com/course/flutter-firebase-build-a-complete-app-for-ios-android/?couponCode=JAN-20">Flutter &amp; Firebase: Build a Complete App for IOS &amp; Android</a> (em inglês)</li></ul><blockquote>Neste curso, você vai construir uma aplicação completa e real para iOS e Android, usando Dart, Flutter e Firebase. Aqui, você começa com o básico. O curso inclui uma introdução completa ao Dart e ao Flutter. Conforme for progredindo, o curso apresentará tópicos mais avançados, com ênfase especial em escrever código pronto para produção, para que você aprenda a construir aplicações robustas que escalem. Conceitos importantes são explicados com diagramas claros. Ao final deste curso, você será uma pessoa desenvolvedora de Flutter competente.</blockquote><h3 id="mais-livros">Mais livros</h3><ul><li><a href="https://www.amazon.com/dp/1092297375?creativeASIN=1092297375&amp;imprToken=3roEoQsoEHSkrt2BzcZW9g&amp;slotNum=33&amp;tag=reactdom-20&amp;linkCode=osi&amp;th=1&amp;psc=1&amp;keywords=flutter%20programming%20books">Learn Google Flutter Fast: 65 Example Apps</a> (em inglês)</li></ul><p>Um livro completo sobre Flutter. Aprenda Flutter através de 65 miniaplicações de exemplo. Você aprenderá a criar tudo, desde a aplicação mais básica até a avançada com arquitetura complexa. No final do livro, o autor explica como publicar sua aplicação nas lojas.<br></p><ul><li><a href="https://www.amazon.com/Beginning-Flutter-Hands-Guide-Development/dp/1119550823/ref=sr_1_5?keywords=Flutter&amp;qid=1579668628&amp;sr=8-5">Beginning Flutter: A Hands-On Guide to App Development 1st Edition</a> (em inglês)</li></ul><p>Esta é uma excelente introdução ao Flutter para que você possa começar rápido e aprender os princípios fundamentais. Se você prefere aprender através dos livros, não hesite!</p><blockquote>Beginning Flutter: A Hands-On Guide to App Development 1st Edition é um recurso essencial tanto para desenvolvedores experientes quanto para novatos interessados em começar com Flutter. É uma introdução ao Flutter, passo a passo. Este livro foi escrito por Marco L. Napoli, CEO da Pixolini Inc. e experiente desenvolvedor de aplicações para dispositivos móveis, web e desktop. Ele tem um forte histórico comprovado no desenvolvimento de sistemas visualmente elegantes e simples de usar.</blockquote><h2 id="conclus-o"><strong>Conclusão</strong></h2><p>Você conhece outros recursos para aprender Flutter? Envie uma mensagem para o autor pelo Twitter para que ele os adicione por lá.</p><p>Fique à vontade para compartilhar este artigo se gostou dele.</p><p>Se quiser mais conteúdo do gênero, pode <a href="https://twitter.com/gaelgthomas/">seguir o autor no Twitter</a>, onde ele escreve sobre desenvolvimento para a web, autoaperfeiçoamento e minha jornada como desenvolvedor <em>full-stack</em>!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como criar uma interface de usuário de aplicação de bate-papo com Flutter e Dart ]]>
                </title>
                <description>
                    <![CDATA[ Atualmente, muitas pessoas usam aplicações de bate-papo para se comunicar com membros da equipe, amigos e familiares por meio de seus smartphones. Isso torna essas aplicações um meio essencial de comunicação. Há também uma alta demanda por interfaces de usuário intuitivas e poderosas com recursos de última geração. A interface ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-criar-uma-interface-de-usuario-de-aplicacao-de-bate-papo-com-flutter-e-dart/</link>
                <guid isPermaLink="false">63b2222144e27f060d7a52cb</guid>
                
                    <category>
                        <![CDATA[ Flutter ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Rafael Fontenelle ]]>
                </dc:creator>
                <pubDate>Mon, 13 Feb 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/6006d9e30a2838549dcb4bb3.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/build-a-chat-app-ui-with-flutter/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Build a Chat App UI With Flutter and Dart</a>
      </p><p>Atualmente, muitas pessoas usam aplicações de bate-papo para se comunicar com membros da equipe, amigos e familiares por meio de seus smartphones. Isso torna essas aplicações um meio essencial de comunicação.</p><p>Há também uma alta demanda por interfaces de usuário intuitivas e poderosas com recursos de última geração. A interface do usuário (ou UI) é o aspecto mais impactante da experiência geral do usuário. Por isso, é importante acertar.</p><p>O desenvolvimento de aplicações com o Flutter conquistou o mundo em termos de desenvolvimento de aplicações para dispositivos móveis multiplataforma. Você pode usá-lo para criar interfaces de usuário perfeitas. Muitas empresas de desenvolvimento usam o Flutter hoje.</p><p>Neste tutorial, apresentarei a você uma mistura de ambos: criaremos uma interface de usuário de aplicação de bate-papo inteiramente no ambiente de codificação do Flutter/Dart. Além de aprender a incrível implementação da interface do usuário de bate-papo no Flutter, também aprenderemos como funcionam seus fluxos de trabalho e estruturas de codificação.</p><p>Então, vamos começar!</p><h2 id="como-criar-um-projeto-no-flutter">Como criar um projeto no Flutter</h2><p>Primeiro, precisamos criar um projeto no Flutter. Para isso, certifique-se de ter instalado o Flutter SDK e outros requisitos relacionados ao desenvolvimento de aplicações do Flutter.</p><p>Se tudo estiver configurado corretamente, para criar um projeto, podemos simplesmente executar o seguinte comando em nosso diretório local desejado:</p><pre><code class="language-bash">flutter create ChatApp
</code></pre><p>Depois de configurar o projeto, podemos navegar dentro do diretório do projeto e executar o seguinte comando no terminal para executar o projeto em um emulador disponível ou em um dispositivo real:</p><pre><code class="language-bash">flutter run
</code></pre><p>Depois de construído com sucesso, obteremos o seguinte resultado na tela do emulador:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-105_1.png" class="kg-image" alt="image-105_1" width="446" height="839" loading="lazy"></figure><h2 id="como-criar-a-ui-da-tela-inicial-principal">Como criar a UI da tela inicial principal</h2><p>Agora, vamos começar a criar a interface de usuário (UI) para nossa aplicação de bate-papo. A tela inicial principal conterá 2 seções:</p><ul><li>a tela de conversa, que vamos implementar como uma página separada; e</li><li>uma barra de navegação inferior.</li></ul><p>Primeiro, precisamos fazer algumas configurações simples no código <em>boilerplate </em>padrão, no arquivo <strong>main.dart</strong>. Vamos remover um pouco do código padrão e adicionar <code>MaterialApp</code>, apontando para o <code>Container</code> vazio como uma página inicial por enquanto:</p><pre><code class="language-dart">import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      debugShowCheckedModeBanner: false,
      home: Container(),
    );
  }
}
</code></pre><p>Agora, no lugar do widget <code>Container</code> vazio, vamos chamar o widget de tela <code>HomePage</code>. Primeiro, no entanto, precisamos implementar a tela.</p><h3 id="como-criar-a-tela-inicial-principal">Como criar a tela inicial principal</h3><p>Dentro do diretório<strong> ./lib </strong>da nossa pasta raiz do projeto, precisamos criar uma pasta chamada <strong>./screens</strong>. Essa pasta conterá todos os arquivos dart para diferentes telas.</p><p>Dentro do diretório <strong>./lib/screens/</strong>, precisamos criar um arquivo chamado <strong>homePage.dart</strong>. Dentro do arquivo <strong>homePage.dart</strong>, precisamos adicionar o código básico do StatelessWidget, conforme mostrado no trecho de código abaixo:</p><pre><code class="language-dart">import 'package:flutter/material.dart';

class HomePage extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Container(
        child: Center(child: Text("Chat")),
      ),

    );
  }
}
</code></pre><p>Agora, precisamos chamar o widget de classe <code>HomePage</code> no arquivo <strong>main.dart</strong> conforme mostrado no trecho de código abaixo:</p><pre><code class="language-dart">class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      debugShowCheckedModeBanner: false,
      home: HomePage(),
    );
  }
}
</code></pre><p>Depois, vamos obter o resultado conforme mostrado na captura de tela do emulador abaixo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-106.png" class="kg-image" alt="image-106" width="446" height="839" loading="lazy"></figure><h3 id="como-criar-a-barra-de-navega-o-inferior">Como criar a barra de navegação inferior</h3><p>Vamos colocar um menu de navegação inferior na tela <code>HomePage</code>. Para isso, vamos utilizar o widget <code>BottomNavigationBar</code> no parâmetro <code>bottomNavigationBar</code>, fornecido pelo widget <code>Scaffold</code>.</p><p>Aqui está a implementação geral do código:</p><pre><code class="language-dart">return Scaffold(
      body: Container(
        child: Center(child: Text("Chat")),
      ),
      bottomNavigationBar: BottomNavigationBar(
        selectedItemColor: Colors.red,
        unselectedItemColor: Colors.grey.shade600,
        selectedLabelStyle: TextStyle(fontWeight: FontWeight.w600),
        unselectedLabelStyle: TextStyle(fontWeight: FontWeight.w600),
        type: BottomNavigationBarType.fixed,
        items: [
          BottomNavigationBarItem(
            icon: Icon(Icons.message),
            title: Text("Chats"),
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.group_work),
            title: Text("Channels"),
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.account_box),
            title: Text("Profile"),
          ),
        ],
      ),
    );
</code></pre><p>Aqui, configuramos um <code>BottomNavigationBar</code> com vários parâmetros de estilo e mantivemos nosso item de menu de navegação no parâmetro <code>items</code>. Para o parâmetro <code>body</code>, usamos um simples <code>Container</code> com um widget <code>Text</code>.</p><p>Então, obteremos a barra de navegação inferior, conforme mostrado na captura de tela do emulador abaixo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-107.png" class="kg-image" alt="image-107" width="446" height="839" loading="lazy"></figure><p>Com a navegação inferior concluída, podemos prosseguir e implementar a seção da lista de conversas, logo acima da barra de navegação inferior.</p><h2 id="como-criar-a-tela-de-lista-de-conversas"><strong>Como criar a tela de lista de conversas</strong></h2><p>Aqui, criaremos a seção da lista de conversas, que conterá uma seção de cabeçalho, uma barra de pesquisa e a visualização da lista de conversas.</p><p>Primeiro, dentro da pasta <strong>./lib/screens</strong>, precisamos criar um arquivo dart chamado <strong>chatPage.dart</strong>. Em seguida, adicionamos um modelo de classe de widget com estado simples dentro dele, conforme mostrado no trecho de código abaixo:</p><pre><code class="language-dart">import 'package:flutter/material.dart';

class ChatPage extends StatefulWidget {
  @override
  _ChatPageState createState() =&gt; _ChatPageState();
}

class _ChatPageState extends State&lt;ChatPage&gt; {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: SingleChildScrollView(
        child: Center(child: Text("Chat")),
      ),
    );
  }
}
</code></pre><p>Depois, precisamos chamar o widget de classe <code>chatPage</code> no lugar do widget <code>Container</code> em <strong>homePage.dart</strong>, conforme mostrado no trecho de código abaixo:</p><pre><code class="language-dart">return Scaffold(
      body: ChatPage(),
      bottomNavigationBar: BottomNavigationBar(
</code></pre><p>Isso nos dará o seguinte resultado, conforme mostrado no emulador abaixo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-108.png" class="kg-image" alt="image-108" width="446" height="839" loading="lazy"></figure><h3 id="como-criar-um-cabe-alho-de-p-gina-de-lista-de-conversas">Como criar um cabeçalho de página de lista de conversas</h3><p>Agora, vamos adicionar o cabeçalho à seção da lista de conversas, que terá um cabeçalho de texto e um botão. O código completo de implementação da interface do usuário é fornecido no trecho de código abaixo:</p><pre><code class="language-dart">return Scaffold(
      body: SingleChildScrollView(
        physics: BouncingScrollPhysics(),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: &lt;Widget&gt;[
            SafeArea(
              child: Padding(
                padding: EdgeInsets.only(left: 16,right: 16,top: 10),
                child: Row(
                  mainAxisAlignment: MainAxisAlignment.spaceBetween,
                  children: &lt;Widget&gt;[
                    Text("Conversations",style: TextStyle(fontSize: 32,fontWeight: FontWeight.bold),),
                    Container(
                      padding: EdgeInsets.only(left: 8,right: 8,top: 2,bottom: 2),
                      height: 30,
                      decoration: BoxDecoration(
                        borderRadius: BorderRadius.circular(30),
                        color: Colors.pink[50],
                      ),
                      child: Row(
                        children: &lt;Widget&gt;[
                          Icon(Icons.add,color: Colors.pink,size: 20,),
                          SizedBox(width: 2,),
                          Text("Add New",style: TextStyle(fontSize: 14,fontWeight: FontWeight.bold),),
                        ],
                      ),
                    )
                  ],
                ),
              ),
            ),
          ],
        ),
      ),
    );
</code></pre><p>Aqui, usamos o <code>SingleChildScrollView</code> para que a seção do corpo do <strong>chatPage.dart</strong> seja totalmente rolável.</p><p>Em seguida, usamos a instância <code>BouncingScrollPhysics</code> para fornecer o efeito de salto quando a rolagem de um usuário atinge o final ou o início.</p><p>Depois disso, adicionamos um widget <code>Text</code> e um <code>Container</code> para exibir a parte inferior do lado direito.</p><p>Por fim, temos um widget <code>Column</code> como filho do widget <code>SingleChildScrollView</code> para que tudo apareça verticalmente na tela.</p><p>Isso nos dará o seguinte resultado conforme mostrado no emulador abaixo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-109.png" class="kg-image" alt="image-109" width="446" height="839" loading="lazy"></figure><p>Logo depois, vamos adicionar uma barra de pesquisa logo abaixo da seção do cabeçalho.</p><h3 id="como-adicionar-uma-barra-de-pesquisa"><strong>Como adicionar uma barra de pesquisa</strong></h3><p>No widget <code>Column</code> de antes, vamos adicionar um widget de barra de pesquisa, logo abaixo da UI da seção do cabeçalho. Assim, como segundo filho do widget <code>Column</code>, precisamos inserir o seguinte código fornecido no trecho de código abaixo:</p><pre><code class="language-dart">Padding(
  padding: EdgeInsets.only(top: 16,left: 16,right: 16),
  child: TextField(
    decoration: InputDecoration(
      hintText: "Search...",
      hintStyle: TextStyle(color: Colors.grey.shade600),
      prefixIcon: Icon(Icons.search,color: Colors.grey.shade600, size: 20,),
      filled: true,
      fillColor: Colors.grey.shade100,
      contentPadding: EdgeInsets.all(8),
      enabledBorder: OutlineInputBorder(
          borderRadius: BorderRadius.circular(20),
          borderSide: BorderSide(
              color: Colors.grey.shade100
          )
      ),
    ),
  ),
),
</code></pre><p>Isso nos dará o seguinte resultado conforme mostrado no emulador abaixo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-110.png" class="kg-image" alt="image-110" width="446" height="839" loading="lazy"></figure><h3 id="como-criar-a-lista-de-conversas"><strong>Como criar a lista de conversas</strong></h3><p>Tendo a seção do cabeçalho e uma barra de pesquisa, vamos implementar a seção da lista de conversas.</p><p>Para isso, precisamos implementar um modelo de objeto de classe para armazenar as instâncias das listas de conversas.</p><p>Então, dentro da pasta <strong>./lib</strong>, precisamos criar uma pasta chamada <strong>./models</strong>. Dentro de <strong>./models</strong>, precisamos criar um arquivo chamado <strong>chatUsersModel.dart</strong>.</p><p>No arquivo de modelo, precisamos criar uma classe de objeto de modelo, conforme mostrado no trecho de código abaixo:</p><pre><code class="language-dart">import 'package:flutter/cupertino.dart';

class ChatUsers{
  String name;
  String messageText;
  String imageURL;
  String time;
  ChatUsers({@required this.name,@required this.messageText,@required this.imageURL,@required this.time});
}
</code></pre><p>O objeto abrigará o nome do usuário, a mensagem de texto, o URL da imagem e a hora.</p><p>Em seguida, precisamos criar uma lista de usuários dentro do <strong>chatPage.dart</strong> conforme mostrado no trecho de código abaixo:</p><pre><code class="language-dart">class _ChatPageState extends State&lt;ChatPage&gt; {
  List&lt;ChatUsers&gt; chatUsers = [
    ChatUsers(text: "Jane Russel", secondaryText: "Awesome Setup", image: "images/userImage1.jpeg", time: "Now"),
    ChatUsers(text: "Glady's Murphy", secondaryText: "That's Great", image: "images/userImage2.jpeg", time: "Yesterday"),
    ChatUsers(text: "Jorge Henry", secondaryText: "Hey where are you?", image: "images/userImage3.jpeg", time: "31 Mar"),
    ChatUsers(text: "Philip Fox", secondaryText: "Busy! Call me in 20 mins", image: "images/userImage4.jpeg", time: "28 Mar"),
    ChatUsers(text: "Debra Hawkins", secondaryText: "Thankyou, It's awesome", image: "images/userImage5.jpeg", time: "23 Mar"),
    ChatUsers(text: "Jacob Pena", secondaryText: "will update you in evening", image: "images/userImage6.jpeg", time: "17 Mar"),
    ChatUsers(text: "Andrey Jones", secondaryText: "Can you please share the file?", image: "images/userImage7.jpeg", time: "24 Feb"),
    ChatUsers(text: "John Wick", secondaryText: "How are you?", image: "images/userImage8.jpeg", time: "18 Feb"),
  ];
</code></pre><p>Agora que temos os dados da lista de conversas dos usuários fictícios, podemos aplicá-los à lista de conversas para criar uma exibição de lista.</p><h3 id="como-criar-um-widget-de-classe-separado-para-conversa-individual"><strong>Como criar um widget de classe separado para conversa individual</strong></h3><p>Aqui, vamos criar um widget de componente separado para os itens individuais na exibição da lista de conversas.</p><p>Para isso, dentro de <strong>./lib</strong>, crie uma pasta chamada <strong>./widgets</strong>. Dentro de <strong>./widgets</strong>, precisamos criar um arquivo chamado <strong>conversationList.dart</strong>. Dentro do novo arquivo de widget, podemos usar o código do seguinte trecho de código:</p><pre><code class="language-dart">import 'package:flutter/material.dart';

class ConversationList extends StatefulWidget{
  String name;
  String messageText;
  String imageUrl;
  String time;
  bool isMessageRead;
  ConversationList({@required this.name,@required this.messageText,@required this.imageUrl,@required this.time,@required this.isMessageRead});
  @override
  _ConversationListState createState() =&gt; _ConversationListState();
}

class _ConversationListState extends State&lt;ConversationList&gt; {
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: (){
      },
      child: Container(
        padding: EdgeInsets.only(left: 16,right: 16,top: 10,bottom: 10),
        child: Row(
          children: &lt;Widget&gt;[
            Expanded(
              child: Row(
                children: &lt;Widget&gt;[
                  CircleAvatar(
                    backgroundImage: NetworkImage(widget.imageUrl),
                    maxRadius: 30,
                  ),
                  SizedBox(width: 16,),
                  Expanded(
                    child: Container(
                      color: Colors.transparent,
                      child: Column(
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: &lt;Widget&gt;[
                          Text(widget.name, style: TextStyle(fontSize: 16),),
                          SizedBox(height: 6,),
                          Text(widget.messageText,style: TextStyle(fontSize: 13,color: Colors.grey.shade600, fontWeight: widget.isMessageRead?FontWeight.bold:FontWeight.normal),),
                        ],
                      ),
                    ),
                  ),
                ],
              ),
            ),
            Text(widget.time,style: TextStyle(fontSize: 12,fontWeight: widget.isMessageRead?FontWeight.bold:FontWeight.normal),),
          ],
        ),
      ),
    );
  }
}
</code></pre><p>Esse arquivo de widget usa o nome do usuário, a mensagem de texto, o URL da imagem, a hora e um valor de tipo de mensagem booleana como parâmetros. Ele retorna o template contendo os valores.</p><p>No <strong>chatPage.dart,</strong> dentro do widget <code>ListView</code>, precisamos chamar o widget <code>ConversationList</code> passando os parâmetros necessários conforme mostrado no trecho de código abaixo:</p><pre><code class="language-dart">ListView.builder(
  itemCount: chatUsers.length,
  shrinkWrap: true,
  padding: EdgeInsets.only(top: 16),
  physics: NeverScrollableScrollPhysics(),
  itemBuilder: (context, index){
    return ConversationList(
      name: chatUsers[index].name,
      messageText: chatUsers[index].messageText,
      imageUrl: chatUsers[index].imageURL,
      time: chatUsers[index].time,
      isMessageRead: (index == 0 || index == 3)?true:false,
    );
  },
),
</code></pre><p>Observe que este widget <code>ListView</code> deve ser mantido como o primeiro filho do widget <code>Column</code> na tela <code>chatPage</code>.</p><p>Isso nos dará o seguinte resultado conforme mostrado no emulador abaixo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-111.png" class="kg-image" alt="image-111" width="446" height="839" loading="lazy"></figure><p>Isso conclui a implementação da interface do usuário de nossa tela de lista de conversas e tela principal da página inicial como um todo. Agora, passaremos para a implementação da tela de detalhes do bate-papo.</p><h2 id="como-criar-uma-tela-de-detalhes-do-bate-papo"><strong>Como criar uma tela de detalhes do bate-papo</strong></h2><p>Agora, vamos criar uma tela de detalhes do bate-papo. Para isso, precisamos criar um arquivo chamado <strong>chatDetailPage.dart</strong> dentro da pasta <strong>./lib/screens/</strong>. Por enquanto, vamos apenas adicionar o código básico conforme mostrado no trecho de código abaixo:</p><pre><code class="language-dart">import 'package:flutter/material.dart';

class ChatDetailPage extends StatefulWidget{
  @override
  _ChatDetailPageState createState() =&gt; _ChatDetailPageState();
}

class _ChatDetailPageState extends State&lt;ChatDetailPage&gt; {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Chat Detail"),
      ),
      body: Container()
    );
  }
}
</code></pre><p>Aqui, retornamos um <code>AppBar</code> básico com <code>Text</code> e um <code>Container</code> vazio como o <code>body</code> do widget <code>Scaffold</code>.</p><p>Agora, vamos adicionar navegação para <code>ChatDetailPage</code> no método <code>onTap</code> do widget <code>GestureHandler</code> no arquivo do widget <strong>conversationList.dart</strong>, conforme mostrado no trecho de código abaixo:</p><pre><code class="language-dart">GestureDetector(
      onTap: (){
        Navigator.push(context, MaterialPageRoute(builder: (context){
          return ChatDetailPage();
        }));
      },
</code></pre><p>Podemos navegar para a tela de detalhes do bate-papo, conforme mostrado na demonstração do emulador abaixo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/2021-01-20-13.40.11.gif" class="kg-image" alt="2021-01-20-13.40.11" width="334" height="727" loading="lazy"></figure><h3 id="como-criar-uma-barra-de-aplica-es-personalizada-para-tela-de-detalhes-do-bate-papo">Como criar uma barra de aplicações personalizada para tela de detalhes do bate-papo</h3><p>Aqui, vamos adicionar uma barra de aplicações personalizada na parte superior da tela de detalhes do bate-papo. Para isso, vamos utilizar o widget <code>AppBar</code> com diversas configurações de parâmetros conforme o trecho de código abaixo:</p><pre><code class="language-dart">return Scaffold(
      appBar: AppBar(
        elevation: 0,
        automaticallyImplyLeading: false,
        backgroundColor: Colors.white,
        flexibleSpace: SafeArea(
          child: Container(
            padding: EdgeInsets.only(right: 16),
            child: Row(
              children: &lt;Widget&gt;[
                IconButton(
                  onPressed: (){
                    Navigator.pop(context);
                  },
                  icon: Icon(Icons.arrow_back,color: Colors.black,),
                ),
                SizedBox(width: 2,),
                CircleAvatar(
                  backgroundImage: NetworkImage("&lt;https://randomuser.me/api/portraits/men/5.jpg&gt;"),
                  maxRadius: 20,
                ),
                SizedBox(width: 12,),
                Expanded(
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    mainAxisAlignment: MainAxisAlignment.center,
                    children: &lt;Widget&gt;[
                      Text("Kriss Benwat",style: TextStyle( fontSize: 16 ,fontWeight: FontWeight.w600),),
                      SizedBox(height: 6,),
                      Text("Online",style: TextStyle(color: Colors.grey.shade600, fontSize: 13),),
                    ],
                  ),
                ),
                Icon(Icons.settings,color: Colors.black54,),
              ],
            ),
          ),
        ),
      ),
      body: Container()
    );
</code></pre><p>Isso nos dará o seguinte resultado conforme mostrado no emulador abaixo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-112.png" class="kg-image" alt="image-112" width="446" height="839" loading="lazy"></figure><h3 id="como-implementar-a-caixa-de-texto-inferior"><strong>Como implementar a caixa de texto inferior</strong></h3><p>Na parte inferior da tela de detalhes do bate-papo, precisamos adicionar uma seção de mensagens, que conterá um editor de texto e um botão para enviar a mensagem.</p><p>Para isso, vamos usar o widget <code>Align</code> e alinhar o filho dentro do widget com a parte inferior da tela. O código geral é fornecido no trecho de código abaixo:</p><pre><code class="language-dart">body: Stack(
        children: &lt;Widget&gt;[
          Align(
            alignment: Alignment.bottomLeft,
            child: Container(
              padding: EdgeInsets.only(left: 10,bottom: 10,top: 10),
              height: 60,
              width: double.infinity,
              color: Colors.white,
              child: Row(
                children: &lt;Widget&gt;[
                  GestureDetector(
                    onTap: (){
                    },
                    child: Container(
                      height: 30,
                      width: 30,
                      decoration: BoxDecoration(
                        color: Colors.lightBlue,
                        borderRadius: BorderRadius.circular(30),
                      ),
                      child: Icon(Icons.add, color: Colors.white, size: 20, ),
                    ),
                  ),
                  SizedBox(width: 15,),
                  Expanded(
                    child: TextField(
                      decoration: InputDecoration(
                        hintText: "Write message...",
                        hintStyle: TextStyle(color: Colors.black54),
                        border: InputBorder.none
                      ),
                    ),
                  ),
                  SizedBox(width: 15,),
                  FloatingActionButton(
                    onPressed: (){},
                    child: Icon(Icons.send,color: Colors.white,size: 18,),
                    backgroundColor: Colors.blue,
                    elevation: 0,
                  ),
                ],
                
              ),
            ),
          ),
        ],
      ),
</code></pre><p>Isso nos dará uma seção de mensagens com um campo de texto para digitar as mensagens e um botão para enviar as mensagens:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-113.png" class="kg-image" alt="image-113" width="443" height="831" loading="lazy"></figure><p>Também temos um botão à esquerda que podemos usar para adicionar outras opções de menu para mensagens.</p><h3 id="como-configurar-a-se-o-de-lista-de-mensagens-na-tela-do-bate-papo"><strong>Como configurar a seção de lista de mensagens na tela do bate-papo</strong></h3><p>Agora, vamos criar a interface do usuário para as mensagens que aparecem na tela de detalhes do bate-papo.</p><p>Primeiro, precisamos criar um modelo que reflita o objeto de instância da mensagem.</p><p>Para isso, precisamos criar um arquivo chamado <strong>chatMessageModel.dart</strong> dentro da pasta <strong>./models</strong> e definir o objeto classe do seguinte modo:</p><pre><code class="language-dart">import 'package:flutter/cupertino.dart';

class ChatMessage{
  String messageContent;
  String messageType;
  ChatMessage({@required this.messageContent, @required this.messageType});
}
</code></pre><p>O objeto de classe aceita o conteúdo da mensagem e o tipo de mensagem (seja do remetente, seja do destinatário) como valores de instância.</p><p>Agora no <strong>chatDetailPage.dart</strong>, precisamos criar uma lista de mensagens a serem exibidas conforme o trecho de código abaixo:</p><pre><code class="language-dart">List&lt;ChatMessage&gt; messages = [
    ChatMessage(messageContent: "Hello, Will", messageType: "receiver"),
    ChatMessage(messageContent: "How have you been?", messageType: "receiver"),
    ChatMessage(messageContent: "Hey Kriss, I am doing fine dude. wbu?", messageType: "sender"),
    ChatMessage(messageContent: "ehhhh, doing OK.", messageType: "receiver"),
    ChatMessage(messageContent: "Is there any thing wrong?", messageType: "sender"),
  ];
</code></pre><p>Em seguida, vamos criar uma exibição de lista para as mensagens no topo dos filhos do widget <code>Stack</code>, acima do widget <code>Align</code>, conforme mostrado no trecho de código abaixo:</p><pre><code class="language-dart">body: Stack(
        children: &lt;Widget&gt;[
          ListView.builder(
            itemCount: messages.length,
            shrinkWrap: true,
            padding: EdgeInsets.only(top: 10,bottom: 10),
            physics: NeverScrollableScrollPhysics(),
            itemBuilder: (context, index){
              return Container(
                padding: EdgeInsets.only(left: 16,right: 16,top: 10,bottom: 10),
                child: Text(messages[index].messageContent),
              );
            },
          ),
          Align(
</code></pre><p>Agora as mensagens aparecerão em forma de lista conforme mostrado na captura de tela do emulador abaixo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-114.png" class="kg-image" alt="image-114" width="443" height="831" loading="lazy"></figure><p>Temos as mensagens aparecendo na tela, mas elas não estão estilizadas da maneira que queremos na tela de bate-papo.</p><h3 id="como-estilizar-e-posicionar-as-mensagens-com-base-no-remetente-e-no-destinat-rio">Como estilizar e posicionar as mensagens com base no remetente e no destinatário</h3><p>Passamos, então a estilizar a lista de mensagens para que apareça como um balão de mensagem de bate-papo. Também vamos posicioná-los com base no tipo de mensagem usando o widget <code>Align</code>, conforme mostrado no trecho de código abaixo:</p><pre><code class="language-dart">ListView.builder(
  itemCount: messages.length,
  shrinkWrap: true,
  padding: EdgeInsets.only(top: 10,bottom: 10),
  physics: NeverScrollableScrollPhysics(),
  itemBuilder: (context, index){
    return Container(
      padding: EdgeInsets.only(left: 14,right: 14,top: 10,bottom: 10),
      child: Align(
        alignment: (messages[index].messageType == "receiver"?Alignment.topLeft:Alignment.topRight),
        child: Container(
          decoration: BoxDecoration(
            borderRadius: BorderRadius.circular(20),
            color: (messages[index].messageType  == "receiver"?Colors.grey.shade200:Colors.blue[200]),
          ),
          padding: EdgeInsets.all(16),
          child: Text(messages[index].messageContent, style: TextStyle(fontSize: 15),),
        ),
      ),
    );
  },
),
</code></pre><p>Isso nos dará o seguinte resultado conforme mostrado no emulador abaixo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/image-115.png" class="kg-image" alt="image-115" width="443" height="831" loading="lazy"></figure><p>Você pode ver uma demonstração geral de toda a interface do usuário da aplicação abaixo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/02/2021-01-20-13.52.45.gif" class="kg-image" alt="2021-01-20-13.52.45" width="331" height="719" loading="lazy"></figure><p>Parabéns! Criamos uma interface de usuário de aplicação de bate-papo intuitiva e moderna inteiramente no ecossistema Flutter e Dart.</p><h2 id="recapitulando">Recapitulando</h2><p>As aplicações de mensagens sociais são um meio de comunicação essencial hoje em dia. Equipados com interfaces de bate-papo poderosas e de última geração com chamadas de áudio e vídeo, anexos de imagens e arquivos e muito mais, essas aplicações de bate-papo tornaram a comunicação muito mais eficiente. Elas tornaram o mundo menor para nós.</p><p>O objetivo principal deste artigo foi mostrar como desenvolver uma interface de usuário simples e intuitiva para aplicações de bate-papo com um design moderno no ecossistema do Flutter. A implementação passo a passo forneceu uma demonstração detalhada da interface do usuário da aplicação, bem como uma visão geral do ambiente de codificação do Flutter.</p><p>Espero que este tutorial o ajude a criar sua próxima aplicação de bate-papo usando o Flutter.</p><p>Você também pode obter inspiração sobre a interface de usuário de aplicação de bate-papo e sobre o desenvolvimento dos recursos dos principais modelos de <a href="https://www.instaflutter.com/app-templates/flutter-chat-app/">aplicação de bate-papo do Flutter</a> disponíveis no mercado. Certifique-se de conferi-los também.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ O que é o Flutter e por que você deve conhecê-lo ]]>
                </title>
                <description>
                    <![CDATA[ As aplicações para dispositivos móveis vem se tornando cada vez mais populares. Felizmente, há muitas ferramentas de programação disponíveis para os desenvolvedores que querem criar essas aplicações. O Flutter é uma dessas ferramentas e vem se destacando nos últimos tempos. O que é o Flutter? O Flutter é um framework ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/o-que-e-o-flutter-e-por-que-voce-deve-conhece-lo/</link>
                <guid isPermaLink="false">63383accffecac05daeb5ef7</guid>
                
                    <category>
                        <![CDATA[ Flutter ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Elizabete Nakamura ]]>
                </dc:creator>
                <pubDate>Thu, 27 Oct 2022 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2022/10/img-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/what-is-flutter-and-why-you-should-learn-it-in-2020/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">What is Flutter and Why You Should Learn it in 2020</a>
      </p><p>As aplicações para dispositivos móveis vem se tornando cada vez mais populares. Felizmente, há muitas ferramentas de programação disponíveis para os desenvolvedores que querem criar essas aplicações. O Flutter é uma dessas ferramentas e vem se destacando nos últimos tempos.</p><h2 id="o-que-o-flutter"><strong>O que é o Flutter?</strong></h2><p>O Flutter é um framework de interface de usuário para dispositivos móveis, gratuito e de código aberto, criado pelo Google e lançado em maio de 2017. Em poucas palavras, ele permite criar uma aplicação para dispositivos móveis nativa apenas com uma base de código. Isto significa que você pode usar uma linguagem de programação e uma base de código para criar duas aplicações diferentes (para iOS e Android).</p><p>O Flutter é composto de duas partes importantes:</p><ul><li>Um SDK (Software Development Kit): uma coleção de ferramentas que vão ajudá-lo a desenvolver suas aplicações. Ele inclui ferramentas para compilar seu código em código de máquina nativo (código para iOS e Android).</li><li>Um framework (biblioteca de IU baseada em widgets): uma coleção de elementos reutilizáveis de IU (botões, entradas de texto, botões deslizantes, entre outros) que você pode personalizar para suas próprias necessidades.</li></ul><p>Para desenvolver com Flutter, você usará uma linguagem de programação chamada Dart. A linguagem foi criada pelo Google em outubro de 2011, mas melhorou muito nesses últimos anos.</p><p>O Dart concentra-se no desenvolvimento de <em>front-end.</em> Você pode usá-lo para criar aplicações para dispositivos móveis e para a web.</p><p>Se você conhece um pouco de programação, o Dart é uma linguagem de programação de objetos tipada. Você pode comparar a sintaxe do Dart com a do JavaScript.</p><blockquote>"O Flutter é o kit de ferramentas de IU do Google para construir belas aplicações nativamente compiladas para celular, web e desktop a partir de uma única base de código." – Google, <a href="https://flutter.dev">flutter.dev</a></blockquote><h2 id="por-que-voc-deve-aprender-o-flutter"><strong>Por que você deve aprender o Flutter?</strong></h2><p>Selecionei algumas das razões pelas quais gosto do Flutter e por que quero usá-lo. Darei a vocês detalhes e meu feedback abaixo.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/10/companies-using-flutter.png" class="kg-image" alt="companies-using-flutter" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/10/companies-using-flutter.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2022/10/companies-using-flutter.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2022/10/companies-using-flutter.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/10/companies-using-flutter.png 2046w" sizes="(min-width: 1200px) 1200px" width="2046" height="730" loading="lazy"><figcaption>Empresas que usam o Flutter</figcaption></figure><h3 id="simples-de-aprender-e-de-usar"><strong>Simples de aprender e de usar</strong></h3><p>O Flutter é um framework moderno e você pode perceber isso! É muito mais simples criar aplicações para dispositivos móveis com ele. Se você tiver usado Java, Swift ou React Native, você notará como o Flutter é diferente.</p><p>Pessoalmente, nunca gostei do desenvolvimento de aplicações para dispositivos móveis até começar a usar o Flutter.</p><p>O que eu amo sobre o Flutter é o fato de que você pode criar uma aplicação nativa real sem tanto código.</p><h3 id="compila-o-r-pida-m-xima-produtividade"><strong>Compilação rápida: máxima produtividade</strong></h3><p>Graças ao Flutter, você pode mudar seu código e ver os resultados em tempo real. É um processo chamado de recarregamento rápido (em inglês, <em>hot reload</em>). Leva pouco tempo depois de salvar para que a aplicação em si seja atualizada.</p><p>Modificações significativas forçam você a recarregar o aplicativo. No entanto, se você trabalha com design e, por exemplo, muda o tamanho de um elemento, isso é feito em tempo real!</p><h3 id="ideal-para-mvps-de-startups"><strong>Ideal para MVPs de startups</strong></h3><p>Se você quiser mostrar seu produto aos investidores o mais rápido possível, o Flutter é uma boa escolha.</p><p>Aqui estão minhas 4 principais razões para usá-lo em seu MVP (do inglês <em>Minimum Viable Product</em> – Produto Minimamente Viável, em português):</p><ul><li>É mais barato desenvolver uma aplicação para dispositivos móveis com o Flutter porque você não precisa criar e manter duas aplicações (uma para iOS e outra para Android).</li><li>Um desenvolvedor é tudo o que você precisa para criar seu MVP. </li><li>Tem bom desempenho – você não notará a diferença entre uma aplicação nativa e uma aplicação do Flutter. </li><li>É bonito - você pode facilmente usar os widgets fornecidos pelo Flutter e personalizá-los para criar uma IU valiosa para seus clientes (você pode encontrar exemplos de aplicações feitas com o Flutter abaixo). </li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/10/flutter-app-example.gif" class="kg-image" alt="flutter-app-example" width="470" height="948" loading="lazy"><figcaption><a href="https://github.com/LiveLikeCounter/Flutter-Todolist">Exemplo de aplicação com Flutter – lista de afazeres</a></figcaption></figure><h3 id="boa-documenta-o"><strong>Boa documentação</strong></h3><p>É importante que a nova tecnologia tenha boa documentação. Nem sempre, no entanto, isso é o caso!</p><p>Você pode aprender muito com a documentação do Flutter. Tudo é muito detalhado com exemplos fáceis para casos de uso básico. Cada vez que tive um problema com um dos widgets no meu código, pude verificar a documentação e a resposta estava lá.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/10/flutter-documentation.png" class="kg-image" alt="flutter-documentation" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/10/flutter-documentation.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2022/10/flutter-documentation.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2022/10/flutter-documentation.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/10/flutter-documentation.png 2202w" sizes="(min-width: 1200px) 1200px" width="2202" height="904" loading="lazy"><figcaption>Arquitetura da documentação do Flutter</figcaption></figure><h3 id="uma-comunidade-em-crescimento"><strong>Uma comunidade em crescimento</strong></h3><p>O Flutter tem uma comunidade robusta e que está apenas começando!</p><p>Eu adoro compartilhar meus conhecimentos e conteúdos úteis sobre programação <a href="https://herewecode.io/">no meu site</a>. Preciso saber que estou trabalhando em uma tecnologia cheia de potencial, com muitos financiadores.</p><p>Quando comecei a usar o Flutter, a primeira coisa que fiz foi procurar comunidades. Para minha surpresa, há um número considerável de lugares para se trocar informações sobre o Flutter.</p><p>Vou dar alguns exemplos de lugares que adoro verificar diariamente. Fique à vontade para <a href="https://twitter.com/gaelgthomas/">me enviar pelo Twitter</a> as suas sugestões.<br></p><ul><li><a href="https://flutterawesome.com/">Flutter Awesome</a>: uma lista fantástica, que seleciona as melhores bibliotecas e ferramentas do Flutter. Esse site publica diariamente conteúdo com muitos exemplos, templates de aplicação, conselhos e assim por diante. 	</li><li><a href="https://github.com/Solido/awesome-flutter">Awesome Flutter</a>: um repositório do GitHub (ligado ao <em>Flutter Awesome</em>) com uma lista de artigos, vídeos, componentes, utilitários e outros.</li><li><a href="https://itsallwidgets.com/">It’s all widgets!</a>: uma lista aberta de aplicações construídas com o Flutter.</li><li><a href="https://medium.com/flutter-community">Flutter Community</a>: uma publicação do Medium, onde você pode encontrar artigos, tutoriais e muito mais.</li></ul><h3 id="suporte-para-android-studio-e-vs-code"><strong>Suporte para Android Studio e VS Code</strong></h3><p>O Flutter está disponível em diferentes IDEs. Os dois principais editores de código para desenvolver com esta tecnologia são o Android Studio (IntelliJ) e o VS Code.</p><p>O Android Studio é um software completo, com tudo já integrado. Você tem que baixar os plugins do Flutter e do Dart para começar.</p><p>O VS Code é uma ferramenta leve, onde tudo é configurável através dos plug-ins do Marketplace.</p><p>Eu uso o Android Studio porque não preciso configurar muitas coisas para trabalhar.</p><p>Você é livre para escolher seu IDE preferido!</p><h2 id="b-nus"><strong>Bônus</strong></h2><h3 id="freelance"><strong>Freelance</strong></h3><p>Se você quiser começar a fazer algum trabalho como freelancer, é uma boa ideia usar o Flutter.</p><p>Acredito que esta tecnologia vai ser bastante comum. Isso significa que as pessoas vão procurar por desenvolvedores que saibam como utilizá-la.</p><p>A maior plataforma para freelancers da França, chamada Malt, publicou recentemente as tendências em tecnologia. O Flutter cresceu +303% nesta plataforma entre 2018 e 2019.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/10/flutter-malt-statistics.png" class="kg-image" alt="flutter-malt-statistics" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/10/flutter-malt-statistics.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2022/10/flutter-malt-statistics.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2022/10/flutter-malt-statistics.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/10/flutter-malt-statistics.png 2150w" sizes="(min-width: 1200px) 1200px" width="2150" height="76" loading="lazy"><figcaption><a href="https://www.malt.com/resources/reports/tech-data-2019/">Estatísticas do Flutter – Malt</a></figcaption></figure><h2 id="conclus-o"><strong>Conclusão</strong></h2><p>Bem, o que você achou? Vai começar a aprender a usar o Flutter nesse ano?</p><p>Espero que esta introdução tenha deixado você interessado e motivado. Sinta-se à vontade para compartilhar este artigo, se gostou.</p><p>Se você quiser mais conteúdo como este, você pode <a href="https://twitter.com/gaelgthomas/">seguir o autor no Twitter,</a> onde ele escreve sobre desenvolvimento para a web, autoaperfeiçoamento e sobre sua jornada como desenvolvedor <em>full-stack</em>!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como usar o padrão Provider no Flutter ]]>
                </title>
                <description>
                    <![CDATA[ Neste artigo, vamos conferir o padrão provider no Flutter. Alguns outros padrões, como a Arquitetura BLoC, usam o padrão provider internamente. Ele, no entanto, é muito fácil de aprender e possui muito menos código repetitivo. Neste artigo, vamos usar o aplicativo padrão de Contador fornecido pelo Flutter e refatorá-lo para ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-usar-o-padrao-provider-no-flutter/</link>
                <guid isPermaLink="false">63388082ffecac05daeb62bc</guid>
                
                    <category>
                        <![CDATA[ Flutter ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ana Beatriz ]]>
                </dc:creator>
                <pubDate>Sun, 23 Oct 2022 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2022/10/flutter-provider-pattern.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/provider-pattern-in-flutter/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Use the Provider Pattern in Flutter</a>
      </p><p>Neste artigo, vamos conferir o padrão <em>provider</em> no Flutter. Alguns outros padrões, como a Arquitetura BLoC, usam o padrão <em>provider </em>internamente. Ele, no entanto, é muito fácil de aprender e possui muito menos código repetitivo.</p><p>Neste artigo, vamos usar o aplicativo padrão de Contador fornecido pelo Flutter e refatorá-lo para que use o padrão <em>provider</em>.</p><p>Se quiser saber o que a equipe do Flutter tem a dizer sobre o padrão <em>provider</em>, confira <a href="https://www.youtube.com/watch?v=d_m5csmrf7I">essa palestra de 2019</a> na sede do Google (vídeo em inglês).</p><p>Se quiser aprender mais sobre a arquitetura BLoC, <a href="https://ayusch.com/understanding-bloc-architecture-in-flutter/">confira aqui</a> (texto em inglês).</p><h3 id="come-ando">Começando</h3><p>Crie um projeto do Flutter e coloque nele o nome que quiser.</p><p>Primeiro, precisamos remover todos os comentários. Assim, teremos um código mais limpo para trabalhar:</p><pre><code class="language-dart">import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);
  final String title;
  @override
  _MyHomePageState createState() =&gt; _MyHomePageState();
}

class _MyHomePageState extends State&lt;MyHomePage&gt; {
  int _counter = 0;
  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: &lt;Widget&gt;[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}</code></pre><p>Agora, adicionamos a dependência para o padrão <em>provider</em> no arquivo <code>pubspec.yaml</code>. Atualmente, a versão mais recente é a 4.1.2.</p><p>O arquivo <code>pubspec.yaml</code> ficará assim:</p><pre><code class="language-yaml">name: provider_pattern_explained
description: A new Flutter project.

publish_to: 'none' 

version: 1.0.0+1

environment:
  sdk: "&gt;=2.7.0 &lt;3.0.0"

dependencies:
  flutter:
    sdk: flutter
  provider: ^4.1.2

  cupertino_icons: ^0.1.3

dev_dependencies:
  flutter_test:
    sdk: flutter

flutter:
  uses-material-design: true</code></pre><p>O aplicativo padrão é basicamente um widget com monitoramento de estado, que é criado novamente toda vez que você clica em <code>FloatingActionButton</code> (que, por sua vez, chama <code>setState()</code>).</p><p>Agora, vamos convertê-lo em um widget sem monitoramento de estado.</p><h3 id="criando-o-provider">Criando o Provider</h3><p>Vamos criar nosso <em>provider</em>. Ele será a fonte da verdade do nosso aplicativo. É onde armazenaremos nosso <em>state </em>(estado) que, neste caso, é a contagem atual.</p><p>Crie uma classe chamada <code>Counter</code> e adicione a variável <code>count</code>:</p><pre><code class="language-dart">import 'package:flutter/material.dart';

class Counter {
  var _count = 0;
}</code></pre><p>Para convertê-la em uma classe <em>provider</em>, estenda <code>ChangeNotifier</code>, do pacote <code>material.dart</code>. Isso nos fornece o método <code>notifyListeners()</code> e notificará todas as funções ouvintes quando mudarmos um valor.</p><p>Depois, adicione um método para incrementar o contador:</p><pre><code class="language-dart">import 'package:flutter/material.dart';

class Counter extends ChangeNotifier {
  var _count = 0;
  void incrementCounter() {
    _count += 1;
  }
}</code></pre><p>No fim desse método, chamaremos <code>notifyListeners()</code>. Isso acionará uma mudança em todo o aplicativo para qualquer widget que esteja ouvindo.</p><p>Esta é a beleza do padrão <em>provider </em>no Flutter – você não precisa se importar com despachar manualmente para <em>streams</em>.</p><p>Por fim, crie uma função <em>getter</em> para retornar o valor do contador. Vamos usá-la para mostrar o valor mais atual:</p><pre><code class="language-dart">import 'package:flutter/material.dart';

class Counter extends ChangeNotifier {
  var _count = 0;
  int get getCounter {
    return _count;
  }

  void incrementCounter() {
    _count += 1;
    notifyListeners();
  }
}</code></pre><h2 id="ouvindo-cliques-no-bot-o"><strong>Ouvindo cliques no botão</strong></h2><p>Agora que temos o <em>provider </em>configurado, podemos continuar e usá-lo em nosso widget principal.</p><p>Primeiramente, vamos converter <code>MyHomePage</code> para um widget sem monitoramento de estado. Vamos ter que remover a chamada para a função <code>setState()</code>, pois ela está disponível apenas em um <code>StatefulWidget</code> (widget com monitoramento de estado):</p><pre><code class="language-dart">import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatelessWidget {
  int _counter = 0;
  final String title;
  MyHomePage({this.title});
  void _incrementCounter() {}
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: &lt;Widget&gt;[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}</code></pre><p>Com isso feito, podemos usar o padrão <em>provider </em>no Flutter para indicar e obter o valor do contador. A cada clique no botão, precisamos incrementar o valor do contador em 1.</p><p>Então, no método <code>_incrementCounter</code> (que é chamado quando o botão é pressionado), adicione esta linha:</p><pre><code class="language-dart">Provider.of&lt;Counter&gt;(context, listen: false).incrementCounter();</code></pre><p>O que acontece aqui? Você pediu para o Flutter subir na <em>árvore de widget</em> e encontrar o primeiro lugar onde <code>Counter</code> é fornecido (mostrarei como fazer isso na próxima seção). É isso que <code>Provider.of()</code> faz.</p><p>Os genéricos (valores dentro dos <strong>&lt;&gt;</strong>) dizem ao Flutter qual tipo de <em>provider</em> procurar. Então, o Flutter sobe na árvore do widget até encontrar o valor fornecido. Se o valor não estiver fornecido em nenhum lugar, então uma exceção é criada.</p><p>Finalmente, quando você já tem o <em>provider</em>, pode chamar qualquer método a partir dele. Aqui, chamamos nosso método de <code>incrementCounter</code>.</p><p>Também precisamos de um contexto (em inglês, <em>context</em>). Então, aceitamos <code>context</code> como argumento e modificamos o método <code>onPressed</code> para que também passe <em>context</em>:</p><pre><code class="language-dart">void _incrementCounter(BuildContext context) {
  Provider.of&lt;Counter&gt;(context, listen: false).incrementCounter();
}</code></pre><p>Observação: indicamos <em>listen </em>como falso, pois não precisamos escutar nenhum valor aqui. Estamos apenas despachando uma ação que será executada.</p><h3 id="fornecendo-o-provider">Fornecendo o Provider</h3><p>O padrão provider no Flutter procurará o último valor fornecido. O diagrama abaixo ajudará você a entender melhor.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/10/Provider-Pattern-Flow.png" class="kg-image" alt="Provider-Pattern-Flow" width="600" height="400" loading="lazy"></figure><p>Neste diagrama, o objeto <strong>A VERDE</strong> estará disponível para o resto dos elementos abaixo dele, que são <strong>B, C, D, E,</strong> e <strong>F.</strong></p><p>Agora, suponha que queremos adicionar funcionalidade ao aplicativo e criamos outro <em>provider</em>, <strong>Z.</strong> Z precisa ser usado por E e F.</p><p>Onde é o melhor lugar para adicioná-lo?</p><p>Podemos adicioná-lo na raiz abaixo de <strong>A</strong>. Ficaria assim:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/10/Provider-Pattern-Flow-2.png" class="kg-image" alt="Provider-Pattern-Flow-2" width="511" height="561" loading="lazy"><figcaption>Tradução da frase: "Funciona, mas não é muito eficiente :("</figcaption></figure><p>Esse método, porém, não é muito eficiente.</p><p>O Flutter passará por todos os widgets abaixo e, então, finalmente, subirá até a raiz. Se você possui árvores de widget muito longas – algo que você provavelmente terá em um aplicativo em produção – não é uma boa ideia colocar tudo na raiz.</p><p>Ao invés disso, podemos olhar para o denominador comum de E e F, que é C. Se colocamos Z abaixo de E e F, dará certo.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/10/Provider-Pattern-Flow-3.png" class="kg-image" alt="Provider-Pattern-Flow-3" width="511" height="581" loading="lazy"><figcaption>Tradução da frase: "Funciona, mas será que podemos melhorar ainda mais?"</figcaption></figure><p>Se quisermos adicionar outro objeto <strong>X</strong>, requerido por E e F? Faremos a mesma coisa. Note, porém, como a árvore continua crescendo.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/10/Provider-Pattern-Flow-4.png" class="kg-image" alt="Provider-Pattern-Flow-4" width="511" height="816" loading="lazy"><figcaption>Tradução das frases: "E assim por diante. Uma árvore muito longa"</figcaption></figure><p>Há uma maneira melhor de gerenciar isso. Que tal se providenciarmos todos os objetos em um nível?</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/10/Provider-Pattern-Flow-5.png" class="kg-image" alt="Provider-Pattern-Flow-5" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/10/Provider-Pattern-Flow-5.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/10/Provider-Pattern-Flow-5.png 651w" width="651" height="541" loading="lazy"></figure><p>Isso é perfeito. Será a maneira de implementarmos nosso padrão <em>provider </em>no Flutter. Usaremos algo chamado <code>MultiProvider</code>, que nos deixa declarar diversos <em>providers</em> em um nível.</p><p>Deixaremos <code>MultiProvider</code> cercar o widget <code>MaterialApp</code>:</p><pre><code class="language-dart">class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider.value(
          value: Counter(),
        ),
      ],
      child: MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
          visualDensity: VisualDensity.adaptivePlatformDensity,
        ),
        home: MyHomePage(title: "AndroidVille Provider Pattern"),
      ),
    );
  }
}</code></pre><p>Com isso, fornecemos o <em>provider </em>para nossa árvore de widget e podemos usá-lo em qualquer lugar abaixo deste nível da árvore.</p><p>Há apenas mais uma coisa a fazer: precisamos atualizar o valor que é mostrado.</p><h2 id="atualizando-o-texto"><strong>Atualizando o texto</strong></h2><p>Para atualizar o texto, obtenha o <em>provider </em>na função do widget <code>MyHomePage</code>. Vamos usar o getter que criamos para obter o valor mais recente.</p><p>Então, simplesmente adicione esse valor ao widget de texto abaixo.</p><p>Terminamos! Nosso arquivo <code>main.dart</code> ficará assim no final:</p><pre><code class="language-dart">import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:provider_pattern_explained/counter.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: [
        ChangeNotifierProvider.value(
          value: Counter(),
        ),
      ],
      child: MaterialApp(
        title: 'Flutter Demo',
        theme: ThemeData(
          primarySwatch: Colors.blue,
          visualDensity: VisualDensity.adaptivePlatformDensity,
        ),
        home: MyHomePage(title: "AndroidVille Provider Pattern"),
      ),
    );
  }
}

class MyHomePage extends StatelessWidget {
  final String title;
  MyHomePage({this.title});
  void _incrementCounter(BuildContext context) {
    Provider.of&lt;Counter&gt;(context, listen: false).incrementCounter();
  }

  @override
  Widget build(BuildContext context) {
    var counter = Provider.of&lt;Counter&gt;(context).getCounter;
    return Scaffold(
      appBar: AppBar(
        title: Text(title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: &lt;Widget&gt;[
            Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () =&gt; _incrementCounter(context),
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}</code></pre><p>Observação: não definimos <code>listen:false</code> nesse caso, pois queremos ficar sabendo de qualquer atualização no valor do contador.</p><p>Aqui está o código fonte no GitHub se você quiser ver: &nbsp;<a href="https://github.com/Ayusch/Flutter-Provider-Pattern">https://github.com/Ayusch/Flutter-Provider-Pattern</a>.</p><p>Peço que informe se tiver qualquer problema.</p><h2 id="boas-vindas-androidville-">Boas-vindas à AndroidVille :)</h2><p>A AndroidVille é uma comunidade de desenvolvedores para dispositivos móveis onde compartilhamos conhecimento relacionado com o desenvolvimento para Android, desenvolvimento em Flutter, tutoriais sobre React Native, Java, Kotlin e muito mais.</p><p><a href="https://rebrand.ly/73lbl3">Clique neste link para juntar-se ao SLACK do AndroidVille. É totalmente gratuito!</a></p><p>Se você gostou deste artigo, fique à vontade para compartilhá-lo no Facebook ou LinkedIn. Você pode seguir o autor no <a href="https://www.linkedin.com/in/ayuschjain">LinkedIn</a>, no <a href="https://twitter.com/ayuschjain">Twitter</a>, no <a href="https://www.quora.com/profile/Ayusch-Jain">Quora</a> e no <a href="https://medium.com/@jain.ayusch10">Medium</a>, onde ele responde perguntas relacionadas ao desenvolvimento para dispositivos móveis, Android e Flutter.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como adicionar notificações push a uma aplicação em Flutter usando o Firebase Cloud Messaging ]]>
                </title>
                <description>
                    <![CDATA[ O Flutter rapidamente se tornou um dos frameworks mais populares para o desenvolvimento de aplicativos móveis multiplataforma. Ele ajuda os desenvolvedores a criar UIs nativas com suporte para diferentes tamanhos de dispositivos, densidades de pixels e orientações, criando uma bela e perfeita UI/UX. Neste tutorial, nós aprenderemos como adicionar notificações ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-adicionar-notificacoes-push-a-uma-aplicacao-em-flutter-usando-o-firebase-cloud-messaging/</link>
                <guid isPermaLink="false">621fd393fe38d304f5225fb1</guid>
                
                    <category>
                        <![CDATA[ Flutter ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ivan L. Seibel ]]>
                </dc:creator>
                <pubDate>Wed, 08 Jun 2022 16:50:18 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/5fd0362ce6787e098393c56a.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-add-push-notifications-to-flutter-app/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Add Push Notifications to a Flutter App using Firebase Cloud Messaging</a>
      </p><p>O Flutter rapidamente se tornou um dos frameworks mais populares para o desenvolvimento de aplicativos móveis multiplataforma. Ele ajuda os desenvolvedores a criar UIs nativas com suporte para diferentes tamanhos de dispositivos, densidades de pixels e orientações, criando uma bela e perfeita UI/UX.</p><p>Neste tutorial, nós aprenderemos como adicionar <em>notificações</em> <em>push</em> (tipo de mensagem exibida automaticamente na tela do seu celular) em um aplicativo Flutter usando o serviço <em>Firebase Cloud Messaging</em> (em português Mensagens na Nuvem do Firebase). Este tutorial lidará com as configurações apenas para a <strong>plataforma Android</strong>.</p><h3 id="primeiro-o-que-s-o-notifica-es-push"><strong>Primeiro, o que são <em>notificações push</em>?</strong></h3><p>Notificações push são um tipo de <em>mensagens pop-up</em> (em português mensagens que "estouram" na tela) que alertam os usuários de aplicativos sobre o que está acontecendo no aplicativo. Elas também são uma forma importante de ampliar o engajamento dos usuários em seu aplicativo.</p><p>Por exemplo, digamos que um usuário esquece do aplicativo depois de instalado. Então, você pode usar notificações <em>push</em> como um mecanismo para recuperar e manter o interesse dos usuários. As notificações <em>push</em> também podem ajudar a direcionar tráfego para o aplicativo.</p><p>O <em>Firebase Cloud Messaging</em> é um serviço oferecido pela Firebase, que permite que você envie notificações para seus usuários. Você pode definir várias configurações para enviar diferentes notificações para públicos diferentes com base em tempo e rotina.</p><p>Por causa de todos esses benefícios, nós vamos usar esse serviço para enviar notificações para nosso aplicativo Flutter.</p><h2 id="passo-1-criar-um-projeto-do-flutter"><strong>Passo 1: criar um projeto do Flutter</strong></h2><p>Primeiro, vamos criar um projeto para o Flutter. Para isso, devemos ter o Flutter SDK instalado em nosso sistema. Você pode encontrar etapas simples para a instalação do Flutter na <a href="https://flutter.dev/docs/get-started/install">documentação oficial</a>.</p><p>Depois de instalar o Flutter com sucesso, você pode simplesmente executar o seguinte comando no diretório desejado para configurar um projeto Flutter completo:</p><pre><code class="language-bash">flutter create pushNotification
</code></pre><p>Depois de configurar o projeto, navegue dentro do diretório do projeto. Execute o seguinte comando no terminal para executar o projeto em um emulador disponível ou em um dispositivo real:</p><pre><code class="language-bash">flutter run
</code></pre><p>Após uma compilação bem-sucedida, você obterá o seguinte resultado na tela do emulador:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-69.png" class="kg-image" alt="image-69" width="325" height="665" loading="lazy"></figure><h2 id="passo-2-integrar-a-configura-o-do-firebase-ao-flutter">Passo 2: integrar a configuração do Firebase ao Flutter</h2><p>Nesta etapa, vamos integrar os serviços do Firebase ao nosso projeto Flutter. Mas primeiro, precisamos criar um projeto do Firebase. As diretrizes de configuração também são fornecidas na <a href="https://firebase.google.com/docs/flutter/setup?platform=android">documentação oficial do Firebase</a> para Flutter.</p><p>Para criar um projeto do <a href="https://firebase.google.com/">Firebase</a>, precisamos fazer login no Firebase e navegar até o console. Lá, podemos simplesmente clicar em 'Adicionar um projeto' (<em>Add a project</em>, em inglês) para iniciar nosso projeto.</p><p>Em seguida, uma janela aparecerá pedindo para inserir o nome do projeto. Aqui, mantive o nome do projeto como <code>FlutterPushNotification</code>, conforme mostrado na captura de tela abaixo:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-70.png" class="kg-image" alt="image-70" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/06/image-70.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2022/06/image-70.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-70.png 1350w" sizes="(min-width: 1200px) 1200px" width="1350" height="634" loading="lazy"></figure><p>Podemos continuar para a próxima etapa quando o projeto for criado. Após a configuração do projeto, obteremos um console de projeto, conforme mostrado na captura de tela abaixo:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-71.png" class="kg-image" alt="image-71" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/06/image-71.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2022/06/image-71.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-71.png 1288w" sizes="(min-width: 1200px) 1200px" width="1288" height="594" loading="lazy"></figure><p>Aqui, vamos configurar o Firebase para a plataforma Android. Portanto, precisamos clicar no ícone do Android exibido na captura de tela acima. Isso nos levará à interface para registrar o Firebase com nosso projeto de aplicativo Flutter.</p><h2 id="passo-3-registrar-o-firebase-no-seu-aplicativo-android"><strong>Passo 3: registrar o Firebase no seu aplicativo Android</strong></h2><p>Como o processo de registro é específico da plataforma, vamos registrar nosso aplicativo para a plataforma Android. Após clicar no ícone do Android, seremos direcionados para uma interface solicitando o nome do pacote Android (<strong>Android package name</strong> em inglês).</p><p>Como o processo de registro é específico da plataforma, vamos registrar nosso aplicativo para a plataforma Android. Após clicar no ícone do Android, seremos direcionados para uma interface solicitando o <strong>nome do pacote Android </strong>(ou <em>Android package name</em>, se a interface estiver em inglês).</p><p>Para adicionar o nome do pacote do nosso projeto Flutter, precisamos localizá-lo primeiro. O nome do pacote estará disponível no arquivo <strong>./android/app/build.gradle</strong> do seu projeto Flutter. Você verá algo assim:</p><pre><code class="language-jsx">com.example.pushNotification
</code></pre><p>Só precisamos copiá-lo e colá-lo no campo de entrada do nome do pacote Android, conforme mostrado na captura de tela abaixo:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-72.png" class="kg-image" alt="image-72" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/06/image-72.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2022/06/image-72.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-72.png 1346w" sizes="(min-width: 1200px) 1200px" width="1346" height="633" loading="lazy"></figure><p>Depois disso, podemos simplesmente clicar no botão 'Registrar aplicativo' ('Register app', em inglês). Isso nos levará à interface onde podemos obter o arquivo <strong>google-services.json</strong> que vinculará nosso aplicativo Flutter aos serviços do Firebase Google.</p><p>Precisamos baixar o arquivo e movê-lo para o diretório <strong>./android/app</strong> do nosso projeto Flutter. As instruções também são mostradas na captura de tela abaixo:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-73.png" class="kg-image" alt="image-73" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/06/image-73.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-73.png 876w" width="876" height="574" loading="lazy"></figure><h2 id="passo-4-adicionar-configura-es-do-firebase-a-arquivos-nativos-em-seu-projeto-flutter"><strong>Passo 4: adicionar configurações do Firebase a arquivos nativos em seu projeto Flutter</strong></h2><p>Agora, para habilitar os serviços do Firebase em nosso aplicativo Android, precisamos adicionar o <a href="https://developers.google.com/android/guides/google-services-plugin">plug-in do google-services</a> aos nossos arquivos Gradle.</p><p>Primeiro, em nosso arquivo Gradle de <strong>nível raiz (nível de projeto)</strong> (<strong>android/build.gradle</strong>), precisamos adicionar regras para incluir o plug-in do Gradle aos serviços do Google. Precisamos verificar se as seguintes configurações estão disponíveis ou não:</p><pre><code class="language-jsx">buildscript {
  repositories {
    // Verifique se você tem a seguinte linha (caso contrário, adicione-a):
    google()  // Repositório Google Maven
  }
  dependencies {
    ...
    // Adicione esta linha
    classpath 'com.google.gms:google-services:4.3.4'
  }
}

allprojects {
  ...
  repositories {
    // Verifique se você tem a seguinte linha (caso contrário, adicione-a):
    google()  // Repositório Google Maven
    ...
  }
}
</code></pre><p>Caso contrário, precisamos adicionar as configurações conforme mostrado no trecho de código acima.</p><p>Agora, em nosso arquivo Gradle do módulo (nível do aplicativo) (<strong>android/app/build.gradle</strong>), precisamos aplicar o plug-in do <strong>Gradle do Google Services</strong>.</p><p>Para isso, precisamos adicionar o trecho de código destacado no trecho de código a seguir ao arquivo <strong>./android/app/build.gradle</strong> do nosso projeto:</p><pre><code class="language-jsx">// Adicione a seguinte linha:
**apply plugin: 'com.google.gms.google-services'**  // Plug-in do Google Services

android {
  // ...
}
</code></pre><p>Agora, precisamos executar o seguinte comando para que algumas configurações automáticas possam ser feitas:</p><pre><code class="language-jsx">flutter packages get
</code></pre><p>Com isso, integramos com sucesso as configurações do Firebase ao nosso projeto Flutter.</p><h2 id="passo-5-integrar-o-firebase-messaging-ao-flutter"><strong>Passo 5: integrar o Firebase Messaging ao Flutter</strong></h2><p>Primeiro, precisamos adicionar a dependência firebase-messaging ao arquivo <strong>./android/app/build.gardle</strong>. No arquivo, precisamos adicionar as seguintes dependências:</p><pre><code class="language-dart">dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'com.google.firebase:firebase-messaging:20.1.0'
}
</code></pre><p>Em seguida, precisamos adicionar uma <code>action</code> (ação) e uma <code>category</code> (categoria) como <code>intent-filter</code> (filtro de intenção) no arquivo <strong>./android/app/src/main/AndroidManifest.xml</strong>:</p><pre><code class="language-xml">&lt;intent-filter&gt;
    &lt;action android:name="FLUTTER_NOTIFICATION_CLICK" /&gt;
    &lt;category android:name="android.intent.category.DEFAULT" /&gt;
&lt;/intent-filter&gt;
</code></pre><p>Agora, precisamos criar um arquivo Java chamado <strong>Application.java</strong> no caminho <strong><strong>/android/app/src/main/java/&lt;app-organization-path&gt;</strong></strong>.</p><p>Em seguida, precisamos adicionar o código do seguinte trecho de código dentro dele:</p><pre><code class="language-java">package io.flutter.plugins.pushNotification;

import io.flutter.app.FlutterApplication;
import io.flutter.plugin.common.PluginRegistry;
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback;
import io.flutter.plugins.GeneratedPluginRegistrant;
import io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin;
import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService;

public class Application extends FlutterApplication implements PluginRegistrantCallback {
    @Override
    public void onCreate() {
        super.onCreate();
        FlutterFirebaseMessagingService.setPluginRegistrant(this);
    }

    @Override
    public void registerWith(PluginRegistry registry) {
        FirebaseMessagingPlugin.registerWith(registry.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"));
    }
}
</code></pre><p>Agora, precisamos atribuir essa atividade <code>Application</code> à tag <code>application</code> do arquivo <strong>AndroidManifest.xml</strong>, conforme mostrado no snippet de código abaixo:</p><pre><code class="language-xml">&lt;application
        android:name=".Application"
</code></pre><p>Isso conclui nossa configuração do plug-in de mensagens do Firebase no código nativo do Android. Agora, vamos passar para o projeto Flutter.</p><h2 id="passo-6-instalar-o-pacote-firebase-messaging"><strong>Passo 6: instalar o pacote Firebase Messaging</strong></h2><p>Aqui, vamos usar o pacote <code>[firebase_messaging]</code>, que <a href="https://pub.dev/packages/firebase_messaging/">você pode encontrar aqui</a>. Para isso, precisamos adicionar o plug-in à opção de dependência do arquivo pubspec.yaml.</p><p>Precisamos adicionar a seguinte linha de código à opção de dependências:</p><pre><code class="language-yaml">firebase_messaging: ^7.0.3
</code></pre><h2 id="passo-7-implementar-uma-tela-de-iu-simples"><strong>Passo 7: implementar uma tela de IU simples</strong></h2><p>Agora, dentro da classe de widget com estado <code>MyHomePage</code> do arquivo <strong>main.dart</strong>, precisamos inicializar a instância <code>FirebaseMessaging</code> e algumas constantes, conforme mostrado no trecho de código abaixo:</p><pre><code class="language-dart">String messageTitle = "Empty";
String notificationAlert = "alert";

FirebaseMessaging _firebaseMessaging = FirebaseMessaging();
</code></pre><p>A variável <code>messageTitle</code> receberá o título da mensagem de notificação e <code>notificationAlert</code> receberá a ação que foi concluída assim que a notificação aparecer.</p><p>Agora, precisamos aplicar essas variáveis ​​à função de construção dentro do corpo do widget <code>Scaffold</code>, conforme mostrado no trecho de código abaixo:</p><pre><code class="language-dart">Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: &lt;Widget&gt;[
            Text(
              notificationAlert,
            ),
            Text(
              messageTitle,
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
    );
  }
</code></pre><p>Em seguida, precisamos executar o aplicativo Flutter executando o seguinte comando no terminal do projeto:</p><pre><code class="language-bash">flutter run
</code></pre><p>Vamos obter o resultado que você vê na imagem abaixo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-74.png" class="kg-image" alt="image-74" width="325" height="665" loading="lazy"></figure><p>Por enquanto, o título da notificação está vazio e o alerta também está conforme definido. Precisamos atribuir um valor adequado a eles assim que recebermos a mensagem de notificação.</p><p>Portanto, precisamos configurar o código para receber a notificação e usar a mensagem de notificação para exibi-la na tela.</p><p>Para isso, precisamos adicionar o código do seguinte trecho de código na função <code>initiState</code>:</p><pre><code class="language-dart">@override
  void initState() {
    // TODO: implementar initState
    super.initState();

    _firebaseMessaging.configure(
      onMessage: (message) async{
        setState(() {
          messageTitle = message["notification"]["title"];
          notificationAlert = "New Notification Alert";
        });

      },
      onResume: (message) async{
        setState(() {
          messageTitle = message["data"]["title"];
          notificationAlert = "Application opened from Notification";
        });

      },
    );
  }
</code></pre><p>Aqui, usamos o método <code>configure</code> fornecido pela instância <code>_firebaseMessaging</code> que, por sua vez, fornece os retornos de chamada <code>onMessage</code> e <code>onResume</code>. Esses retornos de chamada fornecem a notificação <code>message</code> como parâmetro. A resposta <code>message</code> manterá o objeto de notificação como um objeto de mapa.</p><p>A função <code>onMessage</code> é acionada quando a notificação é recebida enquanto estamos executando o aplicativo. A função <code>onResume</code> é acionada quando recebemos o alerta de notificação na barra de notificação do dispositivo e abre o aplicativo por meio da própria notificação <em>push</em>. Nesse caso, o aplicativo pode ser executado em segundo plano ou não ser executado.</p><p>Agora, estamos todos equipados com o aplicativo Flutter. Só precisamos configurar uma mensagem no Firebase Cloud Messaging e enviá-la para o dispositivo.</p><h2 id="passo-8-criar-uma-mensagem-a-partir-do-console-do-firebase-cloud-messaging"><strong>Passo 8: criar uma Mensagem a partir do console do Firebase Cloud Messaging</strong></h2><p>Primeiro, precisamos voltar ao console do Cloud Messaging no site do Firebase, conforme mostrado na imagem abaixo:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-75.png" class="kg-image" alt="image-75" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/06/image-75.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2022/06/image-75.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-75.png 1280w" sizes="(min-width: 1200px) 1200px" width="1280" height="575" loading="lazy"></figure><p>Aqui, podemos ver a opção 'Enviar sua primeira mensagem' (<em>Send your first message</em>, em inglês) na janela, pois não configuramos nenhuma mensagem antes. Precisamos clicar nele, o que nos levará à seguinte janela:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-76.png" class="kg-image" alt="image-76" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/06/image-76.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-76.png 757w" width="757" height="599" loading="lazy"></figure><p>Aqui, podemos inserir o título, texto, imagem e nome da notificação. O título que definimos aqui será fornecido como título no objeto <code>message</code> nos retornos de chamada que definimos antes no projeto Flutter.</p><p>Depois de definir os campos obrigatórios, podemos clicar em 'Avançar' (<em>Next</em>, em inglês), o que nos levará à seguinte janela:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-77.png" class="kg-image" alt="image-77" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/06/image-77.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-77.png 741w" width="741" height="356" loading="lazy"></figure><p>Aqui, precisamos fornecer nosso aplicativo de destino e clicar em 'Avançar' (Next).</p><p>Para Agendamento (Scheduling, em inglês) podemos manter a opção padrão:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-78.png" class="kg-image" alt="image-78" width="488" height="162" loading="lazy"></figure><p>Em seguida, aparecerá a janela Conversão (<em>Conversion</em>, em inglês), que também podemos manter como padrão, e clique no botão 'Avançar' (<em>Next</em>).</p><p>Por fim, aparecerá uma janela onde precisamos inserir os dados personalizados, na qual podemos definir o <code>title</code> e o <code>click_action</code>. Este evento de ação de clique é acionado sempre que clicamos na notificação que aparece na barra de notificação do dispositivo.</p><p>Depois de clicar na mensagem de notificação da barra de notificação, o aplicativo será aberto e o retorno de chamada <code>onResume</code> será acionado, definindo o <code>title</code> conforme atribuído nos dados personalizados na captura de tela abaixo:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-79.png" class="kg-image" alt="image-79" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2022/06/image-79.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2022/06/image-79.png 740w" width="740" height="592" loading="lazy"></figure><p>Agora, estamos prontos para enviar a primeira mensagem de notificação ao dispositivo. Primeiro, vamos tentar com o dispositivo rodando no emulador.</p><p>Ao clicar no botão 'Revisar' (<em>Review</em>, em inglês) e enviar a mensagem, obteremos o seguinte resultado no console do Cloud Messaging, bem como no emulador:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/pushGIF1.gif" class="kg-image" alt="pushGIF1" width="600" height="400" loading="lazy"></figure><p>Aqui, podemos ver que o título e o alerta de notificação na tela do emulador são atualizados assim que enviamos uma mensagem do console. Podemos ter certeza de que o retorno de chamada <code>onMessage</code> foi acionado no aplicativo após receber a mensagem de notificação.</p><p>Agora vamos tentar com o app rodando em segundo plano. Uma vez que enviamos a mensagem para o console, nós iremos receber o resultado conforme mostrado na demonstração abaixo:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2022/06/pushGIF2.gif" class="kg-image" alt="pushGIF2" width="600" height="400" loading="lazy"></figure><p>Aqui, assim que enviamos a mensagem, recebemos uma notificação <em>push</em> na barra de notificações do dispositivo. Então, à medida que arrastamos a barra de notificação, podemos ver o título e o texto da mensagem de notificação. E, clicando na mensagem de notificação, podemos iniciar o aplicativo e exibir os dados personalizados na tela. Isso garante que nosso retorno de chamada <code>onResume</code> foi acionado.</p><p>Terminamos! Adicionamos com sucesso um recurso de notificação por <em>push</em> em nosso aplicativo Flutter usando o Firebase Cloud Messaging.</p><h2 id="conclus-o"><strong>Conclusão</strong></h2><p>As notificações <em>push</em> são essenciais em qualquer aplicativo. Elas podem ser usadas ​​para alertar os usuários sobre o que está acontecendo no aplicativo e podem ajudar a atrair o interesse dos usuários de volta ao aplicativo.</p><p>Além disso, o Firebase Cloud Messaging torna o envio de alertas de notificação muito mais simples e fácil.</p><p>Neste tutorial, começamos configurando o aplicativo Firebase e, em seguida, passamos para a configuração e implementação da configuração de mensagens do Firebase no aplicativo Flutter. Por fim, conseguimos enviar alertas de notificação para o aplicativo usando o Firebase Cloud Messaging.</p><p>O tutorial foi feito para ser simples e fácil de entender. Espero que isso ajude você a adicionar notificações push aos seus aplicativos Flutter. Quer ver alguns exemplos de como você pode implementar tudo isso? Confira esses poderosos <a href="http://instaflutter.com/">modelos do Flutter</a>.</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
