<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Flutter e Dart: do básico à produção on Ivaldo de Oliveira Batista Júnior</title><link>https://ivaldo.eti.br/pt/aprender/flutter-dart/</link><description>Recent content in Flutter e Dart: do básico à produção on Ivaldo de Oliveira Batista Júnior</description><generator>Hugo</generator><language>pt</language><copyright>© 2026 Ivaldo de Oliveira Batista Júnior</copyright><atom:link href="https://ivaldo.eti.br/pt/aprender/flutter-dart/index.xml" rel="self" type="application/rss+xml"/><item><title>Fundamentos do Flutter para desenvolvedores .NET</title><link>https://ivaldo.eti.br/pt/aprender/flutter-dart/fundamentos-flutter/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivaldo.eti.br/pt/aprender/flutter-dart/fundamentos-flutter/</guid><description>&lt;h2 id="o-que-você-vai-construir"&gt;O que você vai construir&lt;/h2&gt;
&lt;p&gt;Você &lt;strong&gt;não precisa saber criar uma página Flutter antes de começar&lt;/strong&gt;. A página será construída neste módulo, uma parte de cada vez. Ao final, você terá um projeto chamado &lt;code&gt;developer_profile&lt;/code&gt; com:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;uma aplicação configurada com &lt;code&gt;MaterialApp&lt;/code&gt; e &lt;code&gt;ThemeData&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;uma página &lt;code&gt;DeveloperProfilePage&lt;/code&gt; em arquivo próprio;&lt;/li&gt;
&lt;li&gt;nome, especialidade, localização e botão de contato;&lt;/li&gt;
&lt;li&gt;layout que continua utilizável em uma janela estreita;&lt;/li&gt;
&lt;li&gt;feedback visual ao clicar no botão;&lt;/li&gt;
&lt;li&gt;um teste automatizado e um README com instruções de execução.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Não cole todo o código final de uma vez. Execute o aplicativo em cada &lt;strong&gt;checkpoint&lt;/strong&gt;. Assim, se algo falhar, você saberá em qual pequena mudança procurar o erro.&lt;/p&gt;</description></item><item><title>Dart moderno para desenvolvedores C#</title><link>https://ivaldo.eti.br/pt/aprender/flutter-dart/dart-moderno/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivaldo.eti.br/pt/aprender/flutter-dart/dart-moderno/</guid><description>&lt;h2 id="dart-não-é-c-com-outra-sintaxe"&gt;Dart não é C# com outra sintaxe&lt;/h2&gt;
&lt;p&gt;A familiaridade com classes, interfaces e &lt;code&gt;async/await&lt;/code&gt; ajuda, mas Dart tem decisões próprias. Código idiomático usa imutabilidade, parâmetros nomeados, construtores concisos e tipos anuláveis explícitos.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-dart" data-lang="dart"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Product&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; Product({
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;required&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.id,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;required&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.name,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;required&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.price,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;String&lt;/span&gt; id;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;String&lt;/span&gt; name;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;double&lt;/span&gt; price;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;final&lt;/code&gt; impede uma nova atribuição à variável após a inicialização. &lt;code&gt;const&lt;/code&gt; cria valores de tempo de compilação quando toda a expressão também é constante. Prefira imutabilidade por padrão; ela reduz estados intermediários e torna widgets mais previsíveis.&lt;/p&gt;</description></item><item><title>Arquitetura Flutter para projetos profissionais</title><link>https://ivaldo.eti.br/pt/aprender/flutter-dart/arquitetura-profissional/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivaldo.eti.br/pt/aprender/flutter-dart/arquitetura-profissional/</guid><description>&lt;h2 id="o-problema-que-a-arquitetura-resolve"&gt;O problema que a arquitetura resolve&lt;/h2&gt;
&lt;p&gt;Um aplicativo pequeno tolera acesso à API, validação e atualização visual no mesmo widget. Em um produto real, isso cria uma cadeia difícil de testar: interface conhece transporte, transporte conhece persistência e qualquer mudança atravessa o sistema.&lt;/p&gt;
&lt;p&gt;Arquitetura não é uma coleção de pastas. É uma direção de dependência:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;presentation -&amp;gt; domain &amp;lt;- data
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ^
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; external
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;O domínio fica no centro e não importa Flutter, Dio, Firebase ou banco local. Camadas externas conhecem contratos internos e podem ser substituídas.&lt;/p&gt;</description></item><item><title>Interfaces profissionais com Material 3</title><link>https://ivaldo.eti.br/pt/aprender/flutter-dart/interfaces-profissionais/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivaldo.eti.br/pt/aprender/flutter-dart/interfaces-profissionais/</guid><description>&lt;h2 id="interface-profissional-é-um-sistema"&gt;Interface profissional é um sistema&lt;/h2&gt;
&lt;p&gt;Uma tela isolada pode parecer correta e ainda falhar quando o produto cresce. Interfaces profissionais dependem de regras compartilhadas para espaçamento, tipografia, cores, estados e comportamento responsivo.&lt;/p&gt;
&lt;p&gt;Material 3 oferece fundamentos e componentes, mas não substitui decisões do produto. Use o tema como fonte de verdade:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-dart" data-lang="dart"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ThemeData buildTheme(ColorScheme colors) &lt;span style="color:#f92672"&gt;=&amp;gt;&lt;/span&gt; ThemeData(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; useMaterial3: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; colorScheme: colors,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; textTheme: &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; TextTheme(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; headlineMedium: TextStyle(fontWeight: FontWeight.w700),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; bodyLarge: TextStyle(fontSize: &lt;span style="color:#ae81ff"&gt;16&lt;/span&gt;, height: &lt;span style="color:#ae81ff"&gt;1.5&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; inputDecorationTheme: &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; InputDecorationTheme(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; border: OutlineInputBorder(),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Evite cores e tamanhos arbitrários dentro de widgets. O tema permite coerência, dark mode e mudanças de marca com menor risco.&lt;/p&gt;</description></item><item><title>Gerenciamento de estado com Provider e Riverpod</title><link>https://ivaldo.eti.br/pt/aprender/flutter-dart/gerenciamento-estado/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivaldo.eti.br/pt/aprender/flutter-dart/gerenciamento-estado/</guid><description>&lt;h2 id="estado-é-informação-ao-longo-do-tempo"&gt;Estado é informação ao longo do tempo&lt;/h2&gt;
&lt;p&gt;Campos de formulário, sessão autenticada, filtros, dados remotos e mensagens de erro têm ciclos de vida diferentes. Antes de escolher uma biblioteca, responda:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Quem é dono deste estado?&lt;/li&gt;
&lt;li&gt;Quem precisa observá-lo?&lt;/li&gt;
&lt;li&gt;Ele sobrevive à navegação?&lt;/li&gt;
&lt;li&gt;É dado de origem ou pode ser derivado?&lt;/li&gt;
&lt;li&gt;Como loading, empty e failure serão representados?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;setState&lt;/code&gt; é adequado para estado local e curto. O problema começa quando widgets distantes dependem do mesmo dado ou quando efeitos assíncronos ficam misturados ao método &lt;code&gt;build&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>APIs REST com Dio e arquitetura corporativa</title><link>https://ivaldo.eti.br/pt/aprender/flutter-dart/apis-rest/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivaldo.eti.br/pt/aprender/flutter-dart/apis-rest/</guid><description>&lt;h2 id="integração-é-uma-fronteira"&gt;Integração é uma fronteira&lt;/h2&gt;
&lt;p&gt;Uma API externa não deve ditar o formato do domínio nem vazar detalhes de transporte para a interface. Organize o fluxo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Widget -&amp;gt; Controller -&amp;gt; Use case -&amp;gt; Repository -&amp;gt; Data source -&amp;gt; HTTP
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;O caminho de volta converte JSON em DTO, DTO em entidade e exceções em falhas conhecidas.&lt;/p&gt;
&lt;h2 id="cliente-dio-centralizado"&gt;Cliente Dio centralizado&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-dart" data-lang="dart"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Dio buildDio(AppEnvironment environment) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; Dio(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; BaseOptions(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; baseUrl: environment.apiUrl,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; connectTimeout: &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; Duration(seconds: &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; receiveTimeout: &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; Duration(seconds: &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sendTimeout: &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; Duration(seconds: &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; headers: &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; {&lt;span style="color:#e6db74"&gt;&amp;#39;Accept&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;application/json&amp;#39;&lt;/span&gt;},
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Não crie um &lt;code&gt;Dio&lt;/code&gt; por requisição. A instância central permite interceptores, cancelamento, métricas e políticas consistentes.&lt;/p&gt;</description></item><item><title>Persistência local com SharedPreferences, Hive e Drift</title><link>https://ivaldo.eti.br/pt/aprender/flutter-dart/persistencia-local/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivaldo.eti.br/pt/aprender/flutter-dart/persistencia-local/</guid><description>&lt;h2 id="persistência-é-parte-do-comportamento"&gt;Persistência é parte do comportamento&lt;/h2&gt;
&lt;p&gt;Preferências, tokens, catálogos e pedidos offline têm requisitos diferentes. A escolha correta começa com perguntas sobre volume, sensibilidade, consulta, consistência e ciclo de vida.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Necessidade&lt;/th&gt;
 &lt;th&gt;Opção típica&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Tema, idioma, flag simples&lt;/td&gt;
 &lt;td&gt;SharedPreferences&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Objetos e cache chave-valor&lt;/td&gt;
 &lt;td&gt;Hive&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Relações, filtros e transações&lt;/td&gt;
 &lt;td&gt;Drift/SQLite&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Segredo pequeno&lt;/td&gt;
 &lt;td&gt;Armazenamento seguro da plataforma&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Não armazene token sensível em preferências comuns. Não use cache como única fonte de verdade sem uma política de validade.&lt;/p&gt;</description></item><item><title>Firebase para aplicações corporativas</title><link>https://ivaldo.eti.br/pt/aprender/flutter-dart/firebase/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivaldo.eti.br/pt/aprender/flutter-dart/firebase/</guid><description>&lt;h2 id="backend-as-a-service-não-elimina-arquitetura"&gt;Backend as a Service não elimina arquitetura&lt;/h2&gt;
&lt;p&gt;Firebase acelera autenticação, dados em tempo real, arquivos e push. O risco é espalhar SDKs por widgets e confundir login com autorização. Trate Firebase como detalhe externo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;presentation -&amp;gt; use cases -&amp;gt; repositories -&amp;gt; Firebase adapters
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Crie projetos separados para desenvolvimento, homologação e produção. Arquivos de configuração identificam o projeto, mas regras e credenciais administrativas continuam exigindo proteção.&lt;/p&gt;
&lt;h2 id="authentication-e-sessão"&gt;Authentication e sessão&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-dart" data-lang="dart"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;abstract&lt;/span&gt; interface &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;AuthRepository&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Stream&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;AppUser&lt;span style="color:#f92672"&gt;?&amp;gt;&lt;/span&gt; authStateChanges();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Future&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;AppUser&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; signInWithEmail(&lt;span style="color:#66d9ef"&gt;String&lt;/span&gt; email, &lt;span style="color:#66d9ef"&gt;String&lt;/span&gt; password);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Future&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; signOut();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A implementação converte &lt;code&gt;FirebaseAuthException&lt;/code&gt; em falhas do aplicativo. Mensagens de login não devem revelar se um e-mail está cadastrado quando isso criar risco de enumeração.&lt;/p&gt;</description></item><item><title>Testes, qualidade e observabilidade</title><link>https://ivaldo.eti.br/pt/aprender/flutter-dart/testes-observabilidade/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivaldo.eti.br/pt/aprender/flutter-dart/testes-observabilidade/</guid><description>&lt;h2 id="qualidade-é-feedback-em-camadas"&gt;Qualidade é feedback em camadas&lt;/h2&gt;
&lt;p&gt;Testes não provam ausência de defeitos; eles reduzem incerteza sobre comportamentos importantes. Uma estratégia equilibrada usa muitos testes rápidos de domínio, testes de widget para comportamento visual e poucos fluxos integrados de alto valor.&lt;/p&gt;
&lt;h2 id="testes-unitários"&gt;Testes unitários&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-dart" data-lang="dart"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;test(&lt;span style="color:#e6db74"&gt;&amp;#39;aplica desconto de dez por cento&amp;#39;&lt;/span&gt;, () {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; calculator &lt;span style="color:#f92672"&gt;=&lt;/span&gt; DiscountCalculator();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;final&lt;/span&gt; result &lt;span style="color:#f92672"&gt;=&lt;/span&gt; calculator.apply(total: &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;, percentage: &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; expect(result, &lt;span style="color:#ae81ff"&gt;90&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Estruture em Arrange, Act e Assert e nomeie pelo comportamento. Um teste deve falhar por uma razão clara.&lt;/p&gt;</description></item><item><title>Publicação, CI/CD e distribuição</title><link>https://ivaldo.eti.br/pt/aprender/flutter-dart/publicacao-cicd/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivaldo.eti.br/pt/aprender/flutter-dart/publicacao-cicd/</guid><description>&lt;h2 id="entrega-é-parte-do-produto"&gt;Entrega é parte do produto&lt;/h2&gt;
&lt;p&gt;O aplicativo não termina quando compila na máquina de desenvolvimento. Uma release profissional precisa ser reproduzível, identificável, assinada, validada e monitorada.&lt;/p&gt;
&lt;h2 id="versionamento-e-artefatos"&gt;Versionamento e artefatos&lt;/h2&gt;
&lt;p&gt;Em &lt;code&gt;pubspec.yaml&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1.2.0+42&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A parte antes de &lt;code&gt;+&lt;/code&gt; comunica a versão ao usuário; o build number identifica uma entrega nas lojas. Gere artefatos com a mesma revisão testada:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;flutter build appbundle --release
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;flutter build ipa --release
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;flutter build web --release
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;section class="command-explainer" aria-label="flutter build &amp;lt;target&amp;gt; --release"&gt;
 &lt;header class="command-explainer__header"&gt;
 &lt;span&gt;Artefato&lt;/span&gt;
 &lt;code&gt;flutter build &amp;lt;target&amp;gt; --release&lt;/code&gt;
 &lt;/header&gt;
 &lt;div class="command-explainer__body"&gt;
 &lt;p&gt;&lt;code&gt;build&lt;/code&gt; produz um artefato para o alvo solicitado; &lt;code&gt;--release&lt;/code&gt; seleciona otimizações e remove ferramentas de desenvolvimento incompatíveis com distribuição. O comando não publica nem comprova que o aplicativo funciona em produção.&lt;/p&gt;</description></item><item><title>Projeto final: Sales Management</title><link>https://ivaldo.eti.br/pt/aprender/flutter-dart/projeto-final/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivaldo.eti.br/pt/aprender/flutter-dart/projeto-final/</guid><description>&lt;h2 id="o-desafio"&gt;O desafio&lt;/h2&gt;
&lt;p&gt;Construa o &lt;strong&gt;Sales Management&lt;/strong&gt;, uma aplicação corporativa para gestão de produtos, clientes e pedidos. O objetivo não é reproduzir uma tela específica, mas demonstrar que você consegue transformar requisitos em uma solução coesa, segura e operável.&lt;/p&gt;
&lt;p&gt;Use a base criada ao longo dos módulos. Faça commits pequenos e mantenha a aplicação executável em cada marco.&lt;/p&gt;
&lt;h2 id="escopo-funcional"&gt;Escopo funcional&lt;/h2&gt;
&lt;h3 id="autenticação-e-usuários"&gt;Autenticação e usuários&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Login por e-mail e um provedor social no ambiente de laboratório.&lt;/li&gt;
&lt;li&gt;Logout e restauração segura de sessão.&lt;/li&gt;
&lt;li&gt;Perfis &lt;code&gt;admin&lt;/code&gt;, &lt;code&gt;supervisor&lt;/code&gt; e &lt;code&gt;seller&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Rotas e ações protegidas também no backend/regras.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="dashboard"&gt;Dashboard&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Receita total, quantidade de pedidos, clientes ativos e produtos cadastrados.&lt;/li&gt;
&lt;li&gt;Estados loading, empty, success e failure.&lt;/li&gt;
&lt;li&gt;Layout adaptado a telefone, tablet e desktop/web.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="produtos-e-clientes"&gt;Produtos e clientes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Listagem, pesquisa, criação, edição e validação.&lt;/li&gt;
&lt;li&gt;Imagem de produto com progresso e tratamento de falha.&lt;/li&gt;
&lt;li&gt;Paginação ou carregamento incremental.&lt;/li&gt;
&lt;li&gt;Registro de atualização para sincronização.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="pedidos"&gt;Pedidos&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Seleção de cliente e produtos.&lt;/li&gt;
&lt;li&gt;Quantidade, valor unitário e total calculado pelo domínio.&lt;/li&gt;
&lt;li&gt;Validação contra pedido vazio ou quantidade inválida.&lt;/li&gt;
&lt;li&gt;Estado de pedido e atualização de estoque em operação consistente.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="continuidade-e-notificações"&gt;Continuidade e notificações&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cache local das consultas importantes.&lt;/li&gt;
&lt;li&gt;Indicação clara de dado desatualizado ou operação pendente.&lt;/li&gt;
&lt;li&gt;Estratégia documentada para conflito e reconexão.&lt;/li&gt;
&lt;li&gt;Notificação de evento de negócio sem payload sensível.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="arquitetura-esperada"&gt;Arquitetura esperada&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lib/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; core/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; environment/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; error/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; network/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; observability/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; features/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; auth/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dashboard/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; products/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; customers/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; orders/
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; main.dart
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Cada feature deve separar &lt;code&gt;domain&lt;/code&gt;, &lt;code&gt;data&lt;/code&gt; e &lt;code&gt;presentation&lt;/code&gt; quando a complexidade justificar. Não crie camadas vazias apenas para obedecer ao desenho; registre decisões e exceções no README.&lt;/p&gt;</description></item><item><title>Referência de comandos e conceitos Flutter/Dart</title><link>https://ivaldo.eti.br/pt/aprender/flutter-dart/referencia/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://ivaldo.eti.br/pt/aprender/flutter-dart/referencia/</guid><description>&lt;p&gt;Esta página é uma &lt;strong&gt;referência de apoio&lt;/strong&gt;, não um substituto para as aulas. Volte aqui quando precisar interpretar um diagnóstico, escolher um comando ou recordar um conceito. Os exemplos consideram um terminal aberto na raiz do projeto, onde está o &lt;code&gt;pubspec.yaml&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nesta referência:&lt;/strong&gt; &lt;a href="https://ivaldo.eti.br/pt/aprender/flutter-dart/referencia/#como-ler-um-comando"&gt;como ler comandos&lt;/a&gt; · &lt;a href="https://ivaldo.eti.br/pt/aprender/flutter-dart/referencia/#diagn%c3%b3stico-e-ambiente-flutter"&gt;diagnóstico Flutter&lt;/a&gt; · &lt;a href="https://ivaldo.eti.br/pt/aprender/flutter-dart/referencia/#cria%c3%a7%c3%a3o-e-execu%c3%a7%c3%a3o"&gt;criação e execução&lt;/a&gt; · &lt;a href="https://ivaldo.eti.br/pt/aprender/flutter-dart/referencia/#depend%c3%aancias-e-gera%c3%a7%c3%a3o"&gt;dependências&lt;/a&gt; · &lt;a href="https://ivaldo.eti.br/pt/aprender/flutter-dart/referencia/#qualidade-e-testes"&gt;qualidade e testes&lt;/a&gt; · &lt;a href="https://ivaldo.eti.br/pt/aprender/flutter-dart/referencia/#build-e-distribui%c3%a7%c3%a3o"&gt;build&lt;/a&gt; · &lt;a href="https://ivaldo.eti.br/pt/aprender/flutter-dart/referencia/#ferramentas-dart"&gt;ferramentas Dart&lt;/a&gt; · &lt;a href="https://ivaldo.eti.br/pt/aprender/flutter-dart/referencia/#gloss%c3%a1rio-da-linguagem-dart"&gt;glossário Dart&lt;/a&gt; · &lt;a href="https://ivaldo.eti.br/pt/aprender/flutter-dart/referencia/#gloss%c3%a1rio-do-flutter"&gt;glossário Flutter&lt;/a&gt; · &lt;a href="https://ivaldo.eti.br/pt/aprender/flutter-dart/referencia/#roteiro-de-diagn%c3%b3stico"&gt;roteiro de diagnóstico&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="como-ler-um-comando"&gt;Como ler um comando&lt;/h2&gt;
&lt;p&gt;Em uma sintaxe como &lt;code&gt;flutter run -d &amp;lt;deviceId&amp;gt; --debug&lt;/code&gt;:&lt;/p&gt;</description></item></channel></rss>