<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: William Cunha Cardoso</title>
    <description>The latest articles on DEV Community by William Cunha Cardoso (@williamcardoso).</description>
    <link>https://dev.to/williamcardoso</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F394574%2F1115bfb6-ff8b-4782-bed8-b2b2461d69a2.jpeg</url>
      <title>DEV Community: William Cunha Cardoso</title>
      <link>https://dev.to/williamcardoso</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/williamcardoso"/>
    <language>en</language>
    <item>
      <title>Developer: From Technician to Product Architect</title>
      <dc:creator>William Cunha Cardoso</dc:creator>
      <pubDate>Fri, 03 Jul 2026 12:26:18 +0000</pubDate>
      <link>https://dev.to/williamcardoso/developer-from-technician-to-product-architect-53kf</link>
      <guid>https://dev.to/williamcardoso/developer-from-technician-to-product-architect-53kf</guid>
      <description>&lt;p&gt;There's a widespread discomfort in the development field. A feeling that the ground has shifted, but no one handed out the new map. Generative AI entered the daily routine, and suddenly what used to take hours, writing functions, building queries, creating components, solving trivial bugs, now takes minutes. Sometimes seconds.&lt;/p&gt;

&lt;p&gt;The most common reactions are either "AI will replace everyone" or "nothing changes, it's just another tool." Both are wrong. The first is alarmism. The second is denial.&lt;/p&gt;

&lt;p&gt;What happened was a &lt;strong&gt;role shift&lt;/strong&gt;. The developer didn't become unnecessary. The type of contribution expected from a developer changed. And understanding this change early, especially for those at the beginning of their career, is the difference between becoming a low-impact professional and an indispensable one.&lt;/p&gt;




&lt;h2&gt;
  
  
  The model we knew
&lt;/h2&gt;

&lt;p&gt;For a long time, the industry operated with a reasonably clear division of responsibilities:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The traditional cycle of a demand:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Someone identifies a problem → someone from product investigates and defines scope → an architect or senior developer designs the solution → a developer implements.&lt;/p&gt;

&lt;p&gt;Each stage had its people, its ceremonies, its rituals. Refinement, sprint planning, design review, code review. Not that it was bad, it was just a structure that made sense when each stage was costly.&lt;/p&gt;

&lt;p&gt;Within this model, career progression looked roughly like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Junior&lt;/strong&gt; received small, well-defined tasks. Coded, tested, fixed. Most of the time was spent on execution: &lt;strong&gt;the manual labor&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mid Level&lt;/strong&gt; took on more complex demands, started thinking about how the code fits into the system. &lt;strong&gt;Refactored, participated in technical decisions&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Senior&lt;/strong&gt; defined architecture, evaluated trade-offs, mentored. &lt;strong&gt;Coded less, thought more&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI compressed this. Much of the manual labor that served as training for juniors is now automated. And this raised the question hanging in the air: &lt;strong&gt;"If AI does what I used to do, what do I do now?"&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What actually changed
&lt;/h2&gt;

&lt;p&gt;To understand the new role, we need to decompose what AI actually affected. It wasn't just the code. It was the entire cycle.&lt;/p&gt;

&lt;h3&gt;
  
  
  Execution became trivial
&lt;/h3&gt;

&lt;p&gt;Writing code was never the end goal, but the means. AI turned the means into something almost trivial. CRUD functions, UI components, basic unit tests, automation scripts, all of this can be generated in seconds with reasonable quality.&lt;/p&gt;

&lt;p&gt;This didn't eliminate the need to know how to program. It eliminated the need to spend &lt;strong&gt;most of your time&lt;/strong&gt; programming trivial things.&lt;/p&gt;

&lt;h3&gt;
  
  
  Research and understanding became accessible
&lt;/h3&gt;

&lt;p&gt;Before, to understand a problem domain, you needed to: read extensive documentation, talk to stakeholders, attend meetings, study the market. Everything took days.&lt;/p&gt;

&lt;p&gt;Today, with AI tools we can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quickly explore a technical domain you're unfamiliar with&lt;/li&gt;
&lt;li&gt;Generate architecture sketches to validate ideas&lt;/li&gt;
&lt;li&gt;Prototype solutions in minutes to test concepts&lt;/li&gt;
&lt;li&gt;Simulate scenarios and anticipate problems&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The boundary between Product and Development blurred
&lt;/h3&gt;

&lt;p&gt;And here is one of the most profound and least discussed changes.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Developer as Product Thinker
&lt;/h2&gt;

&lt;p&gt;There's an uncomfortable truth in the industry: much of the ceremony surrounding the product cycle exists because execution was expensive.&lt;/p&gt;

&lt;p&gt;Think of the classic process: understand the problem, refine the problem, do research, model the solution, execute. Each stage required different people, different meetings, different time. Everything needed to be well-defined before moving to execution, because execution was the bottleneck. Getting the definition wrong meant wasting weeks of development work.&lt;/p&gt;

&lt;p&gt;AI didn't eliminate these stages, but made each of them &lt;strong&gt;cheaper and faster&lt;/strong&gt;. What used to take a week of discovery can now be explored in an afternoon with the right tools. What required a 20-page requirements document before touching code can now be validated with a functional prototype in hours.&lt;/p&gt;

&lt;p&gt;This means developers can and should participate more actively in product stages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Question the problem itself.&lt;/strong&gt; Don't just receive a ticket and execute, but ask: "Is this really the problem that needs to be solved? What's the impact? Is there a simpler way to tackle this?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do micro-research autonomously.&lt;/strong&gt; Explore the domain, understand the user context, compare with existing solutions. All without needing to wait for an alignment meeting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prototype to validate, not just to deliver.&lt;/strong&gt; Create quick, imperfect versions that serve to test hypotheses before investing in robust implementation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model solutions with a product vision.&lt;/strong&gt; Think not only about "how does this work technically" but also "how does this solve the user's problem" and "how does this sustain itself over time."&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's not that the Product Manager role ceased to exist. It's that the overlap between what a PM does and what a dev does has grown significantly. The developer who can operate in that overlap with the differentiator of understanding both technology &lt;strong&gt;and&lt;/strong&gt; product has become the most valuable professional in the market.&lt;/p&gt;

&lt;p&gt;The ceremony hasn't disappeared. But the need to rigidly separate who thinks and who executes has decreased. The same person can now cover a much larger slice of the cycle.&lt;/p&gt;




&lt;h2&gt;
  
  
  The New Role: Orchestrator, Architect, Product Thinker
&lt;/h2&gt;

&lt;p&gt;If before the question was "how do I make this work?", now the questions that define a good developer are:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;About architecture:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"What's the best way to structure this?"&lt;/li&gt;
&lt;li&gt;"How does this communicate with the rest of the system?"&lt;/li&gt;
&lt;li&gt;"What trade-offs are we assuming with this decision?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;About product:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Are we solving the right problem?"&lt;/li&gt;
&lt;li&gt;"Is there a simpler version that already validates the hypothesis?"&lt;/li&gt;
&lt;li&gt;"How does this impact the experience of whoever uses it?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;About execution:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Does what AI generated here make sense?"&lt;/li&gt;
&lt;li&gt;"Which edge cases were ignored?"&lt;/li&gt;
&lt;li&gt;"Does this scale? Is this secure? Is this maintainable?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The developer of the new model is someone who &lt;strong&gt;navigates the entire spectrum&lt;/strong&gt;, from the problem to the code. They don't need to be a specialist in everything, but they need the discernment to know when they're in product territory, when they're in architecture territory, and when they're in execution territory. Having critical thinking, and this part is important, because we can't delegate this fundamental part to AI: the thinking, the reflection, the discernment.&lt;/p&gt;




&lt;h2&gt;
  
  
  Do fundamentals still matter? More than ever!
&lt;/h2&gt;

&lt;p&gt;There's a real risk here. With AI tools generating functional code in seconds, a dangerous temptation emerges: accepting anything that "works."&lt;/p&gt;

&lt;p&gt;And "working" is not the same as "being good."&lt;/p&gt;

&lt;p&gt;Code generated by AI often:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Has generic, ambiguous variable names&lt;/li&gt;
&lt;li&gt;Mixes responsibilities in a single function&lt;/li&gt;
&lt;li&gt;Ignores proper error handling&lt;/li&gt;
&lt;li&gt;Uses approaches that don't scale&lt;/li&gt;
&lt;li&gt;Creates unnecessary coupling&lt;/li&gt;
&lt;li&gt;Passes the happy path test but fails on the first real edge case&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without fundamentals, the developer becomes a &lt;strong&gt;tool operator&lt;/strong&gt; who accepts any output without questioning. It's like an architect who doesn't understand structures: they can design the most beautiful floor plan, but if they don't know that the vault needs a beam, the building collapses.&lt;/p&gt;

&lt;p&gt;The orchestra analogy still holds: the conductor doesn't need to play violin with the same technique as the first violinist, but they need to know how to hear when the violin is out of tune. And for that, they need a trained ear.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fundamentals are the developer's trained ear.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What to study: a practical path
&lt;/h2&gt;

&lt;p&gt;In short:&lt;/p&gt;

&lt;h3&gt;
  
  
  The foundation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Programming logic and data structures:&lt;/strong&gt; understand code structure like: arrays, if/else, switch, and so on. Not to memorize algorithms, but to evaluate whether AI delivered an efficient solution or a time bomb.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debugging:&lt;/strong&gt; reading stack traces, using breakpoints, understanding execution flow, isolating problems. When code is broken, whether AI-generated or not, you have to know how to debug to fix it. Those who don't know end up re-prompting until it works by chance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Git:&lt;/strong&gt; branches, merge, rebase, code collaboration. Seems basic, but it's the foundation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTP and how the web works:&lt;/strong&gt; requests, responses, status codes, headers, authentication. Without this, the system becomes a black box.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Patterns and critical code thinking
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Design patterns:&lt;/strong&gt; Strategy, Observer, Factory, Repository, Dependency Injection, and so on.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SOLID:&lt;/strong&gt; the Single Responsibility Principle alone changes how code is read. When AI generates an 80-line function doing five things, it becomes obvious it needs to be decomposed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tests:&lt;/strong&gt; unit, integration, end-to-end. AI can generate tests, but knowing &lt;strong&gt;what to test and why&lt;/strong&gt; is exclusively human.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clean Code:&lt;/strong&gt; meaningful names, small functions, avoiding side effects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's important to emphasize that these code patterns are not "silver bullets", each has a context where it works. It's also worth considering the application of each one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Architecture and systems
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Software architecture:&lt;/strong&gt; monolith vs. microservices, Clean Architecture, event-driven. Understand trade-offs, not dogmas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data modeling:&lt;/strong&gt; normalization, indexes, SQL vs. NoSQL, domain-driven design. If the data model is wrong, no query saves it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Basic infrastructure:&lt;/strong&gt; Docker, CI/CD, deployment concepts. You don't need to be DevOps, but you need to understand how code gets to production.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Product thinking
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Questioning requirements:&lt;/strong&gt; it's important to understand the limits and expectations of the demand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MVP mindset:&lt;/strong&gt; deliver the smallest functional piece that validates a hypothesis, instead of building the perfect system from the start. Agile philosophy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Business context reading:&lt;/strong&gt; Understand the impact of the demand, who the users are, what the success metric is. You don't need to become a PM, but you need to think like one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Communication:&lt;/strong&gt; writing good PR descriptions, documenting technical decisions, explaining problems clearly, clear git commits. With AI in the mix, the ability to articulate what's needed has become even more central.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  AI orchestration
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Applied prompt engineering:&lt;/strong&gt; being precise in context, constraints, and expected results. This is an extension of technical thinking, not a magical skill.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code review of AI-generated code:&lt;/strong&gt; Develop a critical eye for what the tool produces. Hidden edge cases, disguised inefficiencies, solutions that seem right but aren't.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discernment on when to use AI:&lt;/strong&gt; Not every task benefits from it. Sometimes, for simple problems, writing directly is faster. Sometimes, for learning, trying before asking for help is more valuable.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The shift in the learning cycle
&lt;/h2&gt;

&lt;p&gt;Before, juniors learned by doing repetitive work. Made mistakes, fixed them, repeated. It was slow, but it built intuition.&lt;/p&gt;

&lt;p&gt;The cycle now is different:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Define what needs to be done&lt;/li&gt;
&lt;li&gt;AI generates a starting point&lt;/li&gt;
&lt;li&gt;Evaluate, refine, correct&lt;/li&gt;
&lt;li&gt;Understand &lt;strong&gt;why&lt;/strong&gt; each decision was made&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Step 4 is where real learning happens. Every time AI generates something, the right questions are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Why this approach and not another?"&lt;/li&gt;
&lt;li&gt;"What happens if I change this parameter?"&lt;/li&gt;
&lt;li&gt;"What are the limits of this solution?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These questions transform a tool operator into a software engineer.&lt;/p&gt;




&lt;h2&gt;
  
  
  On the ceremony that's being left behind
&lt;/h2&gt;

&lt;p&gt;To close this point about Product: I'm not saying that refinement, discovery, and planning stopped being important. They remain fundamental. What changed was the &lt;strong&gt;granularity and formality&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It's no longer necessary to wait a week of meetings to understand if an idea makes sense. A developer with product thinking and AI tools can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Explore the problem in an afternoon&lt;/li&gt;
&lt;li&gt;Prototype a solution in hours&lt;/li&gt;
&lt;li&gt;Validate with quick data&lt;/li&gt;
&lt;li&gt;Arrive at refinement already with a concrete proposal&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Heavy ceremony existed because each stage was expensive. Now that stages are cheap, the structure needs to keep up. And the developer who knows how to operate in this lean cycle, from problem to solution, will stand out.&lt;/p&gt;




&lt;p&gt;The programmer didn't die. The role changed. From executor to architect. From typist to orchestrator. From ticket receiver to technical product thinker.&lt;/p&gt;

&lt;p&gt;There's no risk of AI replacing those who program, but rather those who &lt;strong&gt;only&lt;/strong&gt; program.&lt;/p&gt;

&lt;p&gt;The fundamentals that support this transition are the same as always: logic, patterns, architecture, debugging, critical thinking. But now, added to a new dimension: product vision, the ability to navigate from problem to code, and discernment to know what to accept, what to refine, and what to reject from what the machine delivers.&lt;/p&gt;

&lt;p&gt;The future belongs to those who understand the entire system, not just one piece of it.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>productivity</category>
      <category>career</category>
    </item>
    <item>
      <title>Desenvolvedor: de técnico a arquiteto do produto</title>
      <dc:creator>William Cunha Cardoso</dc:creator>
      <pubDate>Wed, 01 Jul 2026 00:10:35 +0000</pubDate>
      <link>https://dev.to/williamcardoso/desenvolvedor-de-tecnico-a-arquiteto-do-produto-32gf</link>
      <guid>https://dev.to/williamcardoso/desenvolvedor-de-tecnico-a-arquiteto-do-produto-32gf</guid>
      <description>&lt;p&gt;Existe um desconforto generalizado na área de desenvolvimento. Uma sensação de que o chão mudou, mas ninguém deu o mapa novo. A IA generativa entrou no dia a dia, e de repente aquilo que antes levava horas: escrever funções, montar queries, criar componentes, resolver bugs triviais. Agora passou a levar minutos. Às vezes, segundos.&lt;/p&gt;

&lt;p&gt;A reação mais comum é: ou "a IA vai substituir todo mundo", ou "não muda nada, é só mais uma ferramenta". As duas posições estão erradas. A primeira é alarmismo. A segunda é negação.&lt;/p&gt;

&lt;p&gt;O que aconteceu foi uma &lt;strong&gt;mudança de papel&lt;/strong&gt;. O desenvolvedor não deixou de ser necessário. O tipo de contribuição que se espera de um desenvolvedor mudou. E entender essa mudança cedo, especialmente para quem está no início da carreira, é a diferença entre se tornar um profissional de pouco impacto e um profissional indispensável.&lt;/p&gt;




&lt;h2&gt;
  
  
  O modelo que conhecíamos
&lt;/h2&gt;

&lt;p&gt;Durante muito tempo, a indústria funcionou com uma divisão razoavelmente clara de responsabilidades:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O ciclo tradicional de uma demanda:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Alguém identifica um problema → alguém de produto investiga e define o escopo → um arquiteto ou pleno projeta a solução → um desenvolvedor implementa.&lt;/p&gt;

&lt;p&gt;Cada etapa tinha suas pessoas, suas cerimônias, seus rituais. Refinamento, sprint planning, design review, code review. Não que isso fosse ruim, só era uma estrutura que fazia sentido quando cada etapa era custosa.&lt;/p&gt;

&lt;p&gt;Dentro desse modelo, a progressão de carreira era mais ou menos assim:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Junior&lt;/strong&gt; recebia tarefas pequenas e bem definidas. Codificava, testava, corrigia. A maior parte do tempo era gasto na execução: &lt;strong&gt;a parte braçal&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pleno&lt;/strong&gt; pegava demandas mais complexas, começava a pensar em como o código se encaixa no sistema. &lt;strong&gt;Refatorava, participava de decisões técnicas&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Senior&lt;/strong&gt; definia arquitetura, avaliava trade-offs, mentorava. &lt;strong&gt;Codava menos, pensava mais&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A IA comprimiu isso. Muito do trabalho braçal que servia como treinamento para o junior agora é automatizado. E isso gerou a pergunta que paira no ar: &lt;strong&gt;"Se a IA faz o que eu fazia, o que eu faço agora?"&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  O que de fato mudou
&lt;/h2&gt;

&lt;p&gt;Para entender o novo papel, é preciso decompor o que a IA realmente afetou. Não foi só o código. Foi o ciclo inteiro.&lt;/p&gt;

&lt;h3&gt;
  
  
  A execução ficou prática
&lt;/h3&gt;

&lt;p&gt;Escrever código nunca foi o objetivo final, mas sim o meio. A IA transformou o meio em algo quase trivial. Funções CRUD, componentes de interface, testes unitários básicos, scripts de automação, tudo isso pode ser gerado em segundos com qualidade razoável.&lt;/p&gt;

&lt;p&gt;Isso não eliminou a necessidade de saber programar. Eliminou a necessidade de passar &lt;strong&gt;a maior parte do tempo&lt;/strong&gt; programando coisas triviais.&lt;/p&gt;

&lt;h3&gt;
  
  
  A pesquisa e o entendimento ficaram acessíveis
&lt;/h3&gt;

&lt;p&gt;Antes, para entender um domínio de problema, era preciso: ler documentação extensa, conversar com stakeholders, participar de reuniões, estudar o mercado. Tudo levava dias.&lt;/p&gt;

&lt;p&gt;Hoje, com as ferramentas de IA podemos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Explorar rapidamente um domínio técnico que não se conhece&lt;/li&gt;
&lt;li&gt;Gerar esboços de arquitetura para validar ideias&lt;/li&gt;
&lt;li&gt;Prototipar soluções em minutos para testar conceitos&lt;/li&gt;
&lt;li&gt;Simular cenários e antecipar problemas&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  A fronteira entre Produto e Desenvolvimento embaçou
&lt;/h3&gt;

&lt;p&gt;E aqui está uma das mudanças mais profundas e menos discutidas.&lt;/p&gt;




&lt;h2&gt;
  
  
  O Desenvolvedor como Pensador de Produto
&lt;/h2&gt;

&lt;p&gt;Existe uma verdade incômoda na indústria: boa parte da cerimônia que envolve o ciclo de produto existe porque a execução era cara.&lt;/p&gt;

&lt;p&gt;Pense no processo clássico: entender o problema, lapidar o problema, fazer pesquisa, modelar a solução, executar. Cada etapa exigia pessoas diferentes, reuniões diferentes, tempo diferente. Tudo precisava ser bem definido antes de ir para a execução, porque a execução era o gargalo. Errar na definição significava desperdiçar semanas de trabalho de desenvolvimento.&lt;/p&gt;

&lt;p&gt;A IA não eliminou essas etapas, mas sim tornou cada uma delas &lt;strong&gt;mais barata e mais rápida&lt;/strong&gt;. O que antes levava uma semana de discovery, hoje pode ser explorado em uma tarde com ferramentas certas. O que exigia um documento de requisitos de 20 páginas antes de tocar código, hoje pode ser validado com um protótipo funcional em horas.&lt;/p&gt;

&lt;p&gt;Isso significa que o desenvolvedor pode e deve participar mais ativamente das etapas de produto:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Questionar o problema em si.&lt;/strong&gt; Não apenas receber um ticket e executar, mas perguntar: "Esse é realmente o problema que precisa ser resolvido? Qual o impacto? Existe uma forma mais simples de atacar isso?"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fazer micro-pesquisa de forma autônoma.&lt;/strong&gt; Explorar o domínio, entender o contexto do usuário, comparar com soluções existentes. Tudo isso sem precisar esperar uma reunião de alinhamento.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prototipar para validar, não apenas para entregar.&lt;/strong&gt; Criar versões rápidas e imperfeitas que sirvam para testar hipóteses antes de investir em implementação robusta.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modelar soluções com visão de produto.&lt;/strong&gt; Pensar não só em "como tecnicamente isso funciona", mas em "como isso resolve o problema do usuário" e "como isso se sustenta ao longo do tempo".&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Não é que a função de Product Manager deixou de existir. É que a sobreposição entre o que um PM faz e o que um dev faz cresceu significativamente. O desenvolvedor que consegue operar nessa sobreposição com o diferencial de entender de técnica &lt;strong&gt;e&lt;/strong&gt; de produto se tornou o profissional mais valioso do mercado.&lt;/p&gt;

&lt;p&gt;A cerimônia não desapareceu. Mas a necessidade de separar rigidamente quem pensa e quem executa diminuiu. Uma mesma pessoa agora consegue cobrir uma fatia muito maior do ciclo.&lt;/p&gt;




&lt;h2&gt;
  
  
  O Novo Papel: Orquestrador, Arquiteto, Pensador de Produto
&lt;/h2&gt;

&lt;p&gt;Se antes a pergunta era "como faço isso funcionar?", agora as perguntas que definem um bom desenvolvedor são:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sobre arquitetura:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Qual a melhor forma de estruturar isso?"&lt;/li&gt;
&lt;li&gt;"Como isso se comunica com o resto do sistema?"&lt;/li&gt;
&lt;li&gt;"Quais trade-offs estamos assumindo com essa decisão?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Sobre produto:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Estamos resolvendo o problema certo?"&lt;/li&gt;
&lt;li&gt;"Existe uma versão mais simples que já valida a hipótese?"&lt;/li&gt;
&lt;li&gt;"Como isso impacta a experiência de quem usa?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Sobre execução:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"O que a IA gerou aqui faz sentido?"&lt;/li&gt;
&lt;li&gt;"Quais edge cases foram ignorados?"&lt;/li&gt;
&lt;li&gt;"Isso escala? Isso é seguro? Isso é manutenível?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O desenvolvedor do novo modelo é alguém que &lt;strong&gt;navega o espectro inteiro&lt;/strong&gt;, desde o problema ao código. Não precisa ser especialista em tudo, mas precisa ter o discernimento para saber quando está no território de produto, quando está no território de arquitetura, e quando está no território de execução. Ter criticidade, e essa parte é importante, pois não podemos delegar essa parte fundamental para a IA: o pensamento, a reflexão, o discernimento.&lt;/p&gt;




&lt;h2&gt;
  
  
  O básico ainda importa? Mais do que nunca!
&lt;/h2&gt;

&lt;p&gt;Existe um risco real aqui. Com ferramentas de IA gerando código funcional em segundos, surge uma tentação perigosa: aceitar qualquer coisa que "funciona".&lt;/p&gt;

&lt;p&gt;E "funcionar" não é o mesmo que "ser bom".&lt;/p&gt;

&lt;p&gt;Código gerado por IA frequentemente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tem variáveis com nomes genéricos e ambíguos&lt;/li&gt;
&lt;li&gt;Mistura responsabilidades numa única função&lt;/li&gt;
&lt;li&gt;Ignora tratamento de erros adequado&lt;/li&gt;
&lt;li&gt;Usa abordagens que não escalam&lt;/li&gt;
&lt;li&gt;Cria acoplamentos desnecessários&lt;/li&gt;
&lt;li&gt;Passa no teste feliz, mas falha no primeiro edge case real&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sem fundamentos, o desenvolvedor vira um &lt;strong&gt;operador de ferramenta&lt;/strong&gt; que aceita qualquer resposta sem questionar. É como um arquiteto que não entende de estrutura: pode desenhar a planta mais bonita, mas se não souber que aquele vão precisa de uma viga, o prédio desaba.&lt;/p&gt;

&lt;p&gt;A analogia do orquestra continua válida: o maestro não precisa tocar violino com a mesma técnica do primeiro violinista, mas precisa saber ouvir quando o violino está desafinado. E para isso, precisa ter ouvido treinado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fundamentos são o ouvido treinado do desenvolvedor.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  O que estudar: um caminho prático
&lt;/h2&gt;

&lt;p&gt;De forma sucinta:&lt;/p&gt;

&lt;h3&gt;
  
  
  A base
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lógica de programação e estrutura de dados:&lt;/strong&gt; entender de estrutura de código como: arrays, if/else, switch e afins. Não para decorar algoritmos, mas para avaliar se a IA entregou uma solução eficiente ou uma bomba.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debugging:&lt;/strong&gt; ler stack traces, usar breakpoints, entender fluxo de execução, isolar problemas. Quando o código está quebrado, seja ele gerado por IA ou não, tem que saber debugar para resolver. Quem não sabe fica refazendo prompt até funcionar por acaso.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Git:&lt;/strong&gt; branches, merge, rebase, colaboração em código. Parece básico, mas é alicerce.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTP e funcionamento web:&lt;/strong&gt; requests, responses, status codes, headers, autenticação. Sem isso, o sistema se torna uma caixa-preta.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Padrões e pensamento crítico de código
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Padrões de projeto:&lt;/strong&gt; Strategy, Observer, Factory, Repository, Dependency Injection e afins.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SOLID:&lt;/strong&gt; o Single Responsibility Principle sozinho muda como código é lido. Quando a IA gerar uma função de 80 linhas fazendo cinco coisas, vai ficar óbvio que precisa decompor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testes:&lt;/strong&gt; unitários, integração, ponta a ponta. A IA pode gerar testes, mas saber &lt;strong&gt;o que testar e por quê&lt;/strong&gt; é exclusivamente humano.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clean Code:&lt;/strong&gt; nomes significativos, funções pequenas, evitar side effects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;É importante salientar que esses padrões de códigos não são "bala de prata", cada qual tem um contexto em que funciona. Também cabe ponderar a aplicação de cada.&lt;/p&gt;

&lt;h3&gt;
  
  
  Arquitetura e sistemas
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Arquitetura de software:&lt;/strong&gt; monolito vs microsserviços, Clean Architecture, event-driven. Entender trade-offs, não dogmas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modelagem de dados:&lt;/strong&gt; normalização, índices, SQL vs NoSQL, modelagem orientada a domínio. Se o modelo de dados está errado, nenhuma query salva.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infraestrutura básica:&lt;/strong&gt; Docker, CI/CD, conceitos de deploy. Não precisa ser DevOps, mas precisa entender como o código vai parar em produção.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pensamento de produto
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Questionamento de requisitos:&lt;/strong&gt; é importante entender os limites e expectativas da demanda.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mentalidade de MVP:&lt;/strong&gt; entregar o menor pedaço funcional que valida uma hipótese, em vez de construir o sistema perfeito de primeira. Filosofia agile.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leitura de contexto de negócio:&lt;/strong&gt; Entender que impacto a demanda tem, quem são os usuários, qual a métrica de sucesso. Não é necessário virar PM, mas é necessário pensar como um.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comunicação:&lt;/strong&gt; escrever boas descrições de PR, documentar decisões técnicas, explicar problemas de forma clara, git commits claros. Com IA no meio, a capacidade de articular o que se precisa ficou ainda mais central.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Orquestração com IA
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prompt engineering aplicado:&lt;/strong&gt; ser preciso no contexto, nos constraints, no resultado esperado. Isso é extensão do pensamento técnico, não uma habilidade mágica.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code review de código gerado:&lt;/strong&gt; Desenvolver olhar crítico para o que a ferramenta produz. Edge cases escondidos, ineficiências disfarçadas, soluções que parecem certas mas não são.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discernimento sobre quando usar IA:&lt;/strong&gt; Nem toda tarefa se beneficia. Às vezes, para problemas simples, escrever direto é mais rápido. Às vezes, para aprender, tentar antes de pedir ajuda é mais valioso.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  A mudança no ciclo de aprendizado
&lt;/h2&gt;

&lt;p&gt;Antes, o junior aprendia fazendo trabalho repetitivo. Errava, corrigia, repetia. Era lento, mas construía intuição.&lt;/p&gt;

&lt;p&gt;O ciclo agora é diferente:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Define-se o que precisa ser feito&lt;/li&gt;
&lt;li&gt;A IA gera um ponto de partida&lt;/li&gt;
&lt;li&gt;Avalia-se, refina-se, corrige-se&lt;/li&gt;
&lt;li&gt;Entende-se &lt;strong&gt;por que&lt;/strong&gt; cada decisão foi tomada&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O passo 4 é onde o aprendizado acontece de verdade. Toda vez que a IA gerar algo, as perguntas certas são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Por que essa abordagem e não outra?"&lt;/li&gt;
&lt;li&gt;"O que acontece se mudar esse parâmetro?"&lt;/li&gt;
&lt;li&gt;"Quais são os limites dessa solução?"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essas perguntas transformam um operador de ferramenta em um engenheiro de software.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sobre a cerimônia que está ficando para trás
&lt;/h2&gt;

&lt;p&gt;Para encerrar esse ponto sobre Produto: não estou dizendo que refinamento, discovery e planejamento deixaram de importar. Continuam fundamentais. O que mudou foi a &lt;strong&gt;granularidade e a formalidade&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Não é mais necessário esperar uma semana de reuniões para entender se uma ideia faz sentido. Um desenvolvedor com pensamento de produto e ferramentas de IA consegue:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Explorar o problema em uma tarde&lt;/li&gt;
&lt;li&gt;Prototipar uma solução em horas&lt;/li&gt;
&lt;li&gt;Validar com dados rápidos&lt;/li&gt;
&lt;li&gt;Chegar no refinamento já com uma proposta concreta&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A cerimônia pesada existia porque cada etapa era cara. Agora que as etapas ficaram baratas, a estrutura precisa acompanhar. E o desenvolvedor que souber operar nesse ciclo enxuto, do problema à solução, se destacará.&lt;/p&gt;




&lt;p&gt;O programador não morreu. O papel mudou. De executor para arquiteto. De digitador para orquestrador. De receptor de tickets para pensador de produto técnico.&lt;/p&gt;

&lt;p&gt;Não corre-se o risco da IA substituir quem programa, mas sim quem &lt;strong&gt;apenas&lt;/strong&gt; programa.&lt;/p&gt;

&lt;p&gt;Os fundamentos que sustentam essa transição são os mesmos de sempre: lógica, padrões, arquitetura, debugging, pensamento crítico. Mas agora, somados a uma nova dimensão: visão de produto, capacidade de navegar do problema ao código, e discernimento para saber o que aceitar, o que refinar e o que rejeitar do que a máquina entrega.&lt;/p&gt;

&lt;p&gt;O futuro pertence a quem entende o sistema inteiro, e não apenas uma peça dele.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>career</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Sending Emails with Dart and Appwrite Serverless Functions</title>
      <dc:creator>William Cunha Cardoso</dc:creator>
      <pubDate>Sat, 09 Sep 2023 15:35:26 +0000</pubDate>
      <link>https://dev.to/williamcardoso/sending-emails-with-dart-and-appwrite-serverless-functions-3dmj</link>
      <guid>https://dev.to/williamcardoso/sending-emails-with-dart-and-appwrite-serverless-functions-3dmj</guid>
      <description>&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Introduction&lt;/li&gt;
&lt;li&gt;Identifying Requirements&lt;/li&gt;
&lt;li&gt;Preparing the Environment&lt;/li&gt;
&lt;li&gt;Hands-On

&lt;ul&gt;
&lt;li&gt;Create or Link to a Project&lt;/li&gt;
&lt;li&gt;Create a Function&lt;/li&gt;
&lt;li&gt;Code the Function

&lt;ul&gt;
&lt;li&gt;Using the http Package&lt;/li&gt;
&lt;li&gt;Wrapping with Try/Catch&lt;/li&gt;
&lt;li&gt;Response Class&lt;/li&gt;
&lt;li&gt;Email Dispatch Method&lt;/li&gt;
&lt;li&gt;Handling Requests&lt;/li&gt;
&lt;li&gt;Code mounted&lt;/li&gt;
&lt;li&gt;Set Up Variables in Functions&lt;/li&gt;
&lt;li&gt;Deployment&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Testing

&lt;ul&gt;
&lt;li&gt;Testing via Appwrite Console&lt;/li&gt;
&lt;li&gt;Testing via CURL Request&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;li&gt;Considerations&lt;/li&gt;
&lt;li&gt;Additional Resources&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Sending emails is a common requirement for various business and project purposes. Whether it's for user authentication, sending invoices, or notifying customers, having a flexible and modular email dispatch solution is essential. In this tutorial, we'll explore how to create a serverless email dispatch function using Dart and Appwrite. This solution not only sends emails but also adheres to principles like modularization and the Open/Closed Solid Principle.&lt;/p&gt;

&lt;h2&gt;
  
  
  Identifying Requirements
&lt;/h2&gt;

&lt;p&gt;Before we start building our email dispatch service, let's identify the key requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sender: The email address from which the email will be sent.&lt;/li&gt;
&lt;li&gt;Recipients: The list of email addresses and names of the recipients.&lt;/li&gt;
&lt;li&gt;Body: The content of the email.&lt;/li&gt;
&lt;li&gt;Subject: The subject line of the email.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These requirements will help us define the contract for our service.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preparing the Environment
&lt;/h2&gt;

&lt;p&gt;For this tutorial, we'll need the following tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Appwrite CLI&lt;/li&gt;
&lt;li&gt;Brevo Account&lt;/li&gt;
&lt;li&gt;Dart&lt;/li&gt;
&lt;li&gt;Visual Studio Code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feel free to use alternative tools, but ensure they are properly configured in your environment. In this tutorial, I'll be using Appwrite Console version 1.1.2.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hands-On
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Create or Link to a Project
&lt;/h3&gt;

&lt;p&gt;To get started, we need a project to host our functions. You can create a new project or link to an existing one using the Appwrite CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;appwrite init project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Follow the CLI prompts to either link to an existing project or create a new one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create a Function
&lt;/h3&gt;

&lt;p&gt;Now, let's create a Dart runtime function using the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;appwrite init &lt;span class="k"&gt;function&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Answer the questions prompted by the CLI to configure your function. Remove all the comment and initial code. At the end, your function might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;Future&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Code the Function
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Using the http Package
&lt;/h4&gt;

&lt;p&gt;We'll use the http package to perform HTTP requests for sending emails. To add it to your project, navigate to your functions directory and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dart pub add http
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Wrapping with Try/Catch
&lt;/h4&gt;

&lt;p&gt;To handle errors gracefully, wrap your code with a try/catch block like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;Future&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Your code goes here&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Error: &lt;/span&gt;&lt;span class="si"&gt;${error.toString()}&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;status:&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Response Class
&lt;/h4&gt;

&lt;p&gt;Create a response class to define the structure of the response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ResponseMap&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;statusCode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="n"&gt;ResponseMap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;statusCode&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Email Dispatch Method
&lt;/h4&gt;

&lt;p&gt;Now, create a method that sends the email:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;Future&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ResponseMap&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;sendTransactionalEmail&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="kd"&gt;required&lt;/span&gt; &lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;dynamic&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;recipients&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="kd"&gt;required&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="kd"&gt;required&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="kd"&gt;required&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="kd"&gt;required&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;senderEmail&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="kd"&gt;required&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;recipients&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="n"&gt;ArgumentError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Recipients list cannot be empty'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;apiKey&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="n"&gt;ArgumentError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'API Key cannot be empty'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="n"&gt;ArgumentError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Email body cannot be empty'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="n"&gt;ArgumentError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Email host cannot be empty'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;senderMail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="n"&gt;ArgumentError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Sender email cannot be empty'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="n"&gt;ArgumentError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Email subject cannot be empty'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Uri&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s"&gt;'Content-Type'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;'application/json'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;'api-key'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;'email'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;senderMail&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;recipients&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s"&gt;'sender'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;'to'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;'htmlContent'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;'subject'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;subject&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;headers:&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;body:&lt;/span&gt; &lt;span class="n"&gt;jsonEncode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ResponseMap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;'Email sent successfully! &lt;/span&gt;&lt;span class="si"&gt;${response.reasonPhrase}&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;statusCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Handling Requests
&lt;/h4&gt;

&lt;p&gt;Handle incoming requests in your function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;Future&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;apiKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;variables&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'BREVO_API_KEY'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;apiKey&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="n"&gt;ArgumentError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Missing API Key'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;emailHost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;variables&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'EMAIL_HOST'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;emailHost&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="n"&gt;ArgumentError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Missing Email Host'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="n"&gt;ArgumentError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Missing payload'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jsonDecode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="n"&gt;ArgumentError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Missing payload'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;senderMail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'sender'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;senderMail&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="n"&gt;ArgumentError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Missing sender email'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;subject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'subject'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subject&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="n"&gt;ArgumentError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Missing email subject'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'body'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="n"&gt;ArgumentError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Missing email body'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;recipients&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;dynamic&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;[];&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="n"&gt;recipient&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'recipients'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;recipients&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;recipient&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'email'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;recipient&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;]});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;sendTransactionalEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;apiKey:&lt;/span&gt; &lt;span class="n"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;body:&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;host:&lt;/span&gt; &lt;span class="n"&gt;emailHost&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;recipients:&lt;/span&gt; &lt;span class="n"&gt;recipients&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;senderMail:&lt;/span&gt; &lt;span class="n"&gt;senderMail&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;subject:&lt;/span&gt; &lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;status:&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;statsCode&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Error: &lt;/span&gt;&lt;span class="si"&gt;${error.toString()}&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;status:&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Code mounted
&lt;/h4&gt;

&lt;p&gt;In the end, your code should look like this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:http/http.dart'&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'dart:convert'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;Future&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;apiKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;variables&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'BREVO_API_KEY'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;apiKey&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Missing API Key'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;status:&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;emailHost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;variables&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'EMAIL_HOST'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;emailHost&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Missing Email Host'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;status:&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;jsonDecode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Missing payload'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;status:&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;senderMail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'sender'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;senderMail&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Missing sender email'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;status:&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;subject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'subject'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subject&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Missing email subject'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;status:&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'body'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Missing email body'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;status:&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;recipients&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;dynamic&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;[];&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="n"&gt;recipient&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'recipients'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="n"&gt;recipients&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="s"&gt;"email"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;recipient&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'email'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;recipient&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'name'&lt;/span&gt;&lt;span class="p"&gt;]});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;sendTransactionalEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;apiKey:&lt;/span&gt; &lt;span class="n"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;body:&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;host:&lt;/span&gt; &lt;span class="n"&gt;emailHost&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;recipients:&lt;/span&gt; &lt;span class="n"&gt;recipients&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;senderMail:&lt;/span&gt; &lt;span class="n"&gt;senderMail&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;subject:&lt;/span&gt; &lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;status:&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;statsCode&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Error: &lt;/span&gt;&lt;span class="si"&gt;${error.toString()}&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;status:&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;Future&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ResponseMap&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;sendTransactionalEmail&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="kd"&gt;required&lt;/span&gt; &lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;dynamic&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;recipients&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="kd"&gt;required&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="kd"&gt;required&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="kd"&gt;required&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="kd"&gt;required&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;senderMail&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="kd"&gt;required&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;recipients&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="n"&gt;ArgumentError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Recipients list cannot be empty'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;apiKey&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="n"&gt;ArgumentError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'API Key cannot be empty'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="n"&gt;ArgumentError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Email body cannot be empty'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="n"&gt;ArgumentError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Email host cannot be empty'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;senderMail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="n"&gt;ArgumentError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Sender email cannot be empty'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="n"&gt;ArgumentError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Email subject cannot be empty'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;Uri&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s"&gt;'Content-Type'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;'application/json'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;'api-key'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;'email'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;senderMail&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;recipients&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="s"&gt;'sender'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;'to'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;'htmlContent'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;'subject'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;subject&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;headers:&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;body:&lt;/span&gt; &lt;span class="n"&gt;jsonEncode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ResponseMap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;'Email sent successfully! &lt;/span&gt;&lt;span class="si"&gt;${response.reasonPhrase}&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;statusCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ResponseMap&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;statsCode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="n"&gt;ResponseMap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;statsCode&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Set Up Variables in Functions
&lt;/h4&gt;

&lt;p&gt;In the Functions Variables settings, configure the following variables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;BREVO_API_KEY&lt;/li&gt;
&lt;li&gt;EMAIL_HOST&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You'll obtain these values from your Brevo Account panel. These should remain secret and not be included in your request payloads.&lt;/p&gt;

&lt;h4&gt;
  
  
  Deployment
&lt;/h4&gt;

&lt;p&gt;Deploy your Appwrite function. Ensure you are in the same directory as your functions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ../..
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;appwrite deploy &lt;span class="k"&gt;function&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Select your function and deploy it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Testing
&lt;/h3&gt;

&lt;p&gt;You can test your function via the Appwrite Console or by making an HTTP request. Here's an example JSON payload for testing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sender"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your-brevo-senders-option@mail.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"body"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;!DOCTYPE html&amp;gt;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Simple HTML Message&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1 style=&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;color: blue;&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;&amp;gt;Simple HTML Message&amp;lt;/h1&amp;gt;&amp;lt;p&amp;gt;This is a sample HTML email.&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;You can customize it as needed.&amp;lt;/p&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"subject"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Testing Email Sending with Functions"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"recipients"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"recipient@mail.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Recipient Name"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alternatively, you can use CURL to make an HTTP request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
curl &lt;span class="nt"&gt;--request&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--url&lt;/span&gt; https://cloud.appwrite.io/v1/functions/YOUR-FUNCTION-ID/executions &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'X-Appwrite-Key: YOUR-API-KEY'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--header&lt;/span&gt; &lt;span class="s1"&gt;'X-Appwrite-Project: YOUR-PROJECT-ID'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data&lt;/span&gt; &lt;span class="s1"&gt;'{
  "data": "{\"sender\":\"sender@mail.com\",\"body\":\"&amp;lt;!DOCTYPE html&amp;gt;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Simple HTML Message&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1 style=\\\"color: blue;\\\"&amp;gt;Simple HTML Message&amp;lt;/h1&amp;gt;&amp;lt;p&amp;gt;This is a sample HTML email.&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;You can customize it as needed.&amp;lt;/p&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;\",\"subject\":\"Testing Email Sending with Functions\",\"recipients\":[{\"email\":\"recipient@mail.com\",\"name\":\"Recipient Name\"}]}"
}
'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In this tutorial, we've learned how to create a serverless email dispatch function using Dart and Appwrite. By following modularization principles and adhering to the Open/Closed Solid Principle, you can build a flexible and reliable email service for your applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Considerations
&lt;/h2&gt;

&lt;p&gt;When creating serverless functions, consider the pros and cons. These functions provide a RESTful interface to specific services, making it language-agnostic and location-independent. However, ensure proper error handling, security, and scalability for production use.&lt;br&gt;
In addition, by reading some posts on internet I tried to identify how properly return errors in the request but I could not handle it. Appwrite docs only teachs to current version. If you test it, you'll see my request, on error, it will return the proper message, but still gives a 200 status code. It can be properly resolved on latest appwrite version with proper documentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Additional Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://appwrite.io/docs"&gt;Appwrite Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dart.dev/guides"&gt;Dart Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pub.dev/packages/http"&gt;HTTP Package Documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>appwrite</category>
      <category>dart</category>
      <category>serverless</category>
      <category>programming</category>
    </item>
    <item>
      <title>Stateless e Stateful Widgets</title>
      <dc:creator>William Cunha Cardoso</dc:creator>
      <pubDate>Fri, 05 Jun 2020 00:47:23 +0000</pubDate>
      <link>https://dev.to/williamcardoso/stateless-e-stateful-widgets-3574</link>
      <guid>https://dev.to/williamcardoso/stateless-e-stateful-widgets-3574</guid>
      <description>&lt;h1&gt;
  
  
  O que são Widgets?
&lt;/h1&gt;

&lt;p&gt;São componentes que o Flutter utiliza para poder construir a interface para o usuário.&lt;/p&gt;

&lt;h1&gt;
  
  
  StatelessWidget
&lt;/h1&gt;

&lt;h2&gt;
  
  
  O que é?
&lt;/h2&gt;

&lt;p&gt;São widgets que não possuem estados mutáveis. Permanecem o mesmo desde a sua construção.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quando usar?
&lt;/h2&gt;

&lt;p&gt;São úteis quando utilizados para apenas dispor de informação estática, sem alteração de estado e sem mudança de comportamento.&lt;/p&gt;

&lt;h1&gt;
  
  
  StatefulWidget
&lt;/h1&gt;

&lt;h2&gt;
  
  
  O que é
&lt;/h2&gt;

&lt;p&gt;São widgets que possuem estados mutáveis. Onde, mesmo após sua construção, após algum gatilho ser disparado, este precisa atualizar o estado.&lt;br&gt;
Um exemplo de atualização de estado para o StatefulWidget é o método setState, que irá reconstruir o Widget em questão.&lt;br&gt;
Vale lembrar que este não é a única forma de gerenciar estados no Flutter, existem outras opções como MobX e Bloc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quando usar?
&lt;/h2&gt;

&lt;p&gt;Considere usá-lo quando este Widget precisa mudar de comportamento de acordo com algum gatilho. Seja quando algum sensor disparar, quando uma lista de variáveis carregar, quando o usuário clicar e algo ser performado.&lt;/p&gt;

&lt;h1&gt;
  
  
  Referências
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://api.flutter.dev/"&gt;https://api.flutter.dev/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>flutter</category>
      <category>dart</category>
      <category>beginners</category>
      <category>devsbrasileiros</category>
    </item>
  </channel>
</rss>
