<?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: Rodrigo Castro</title>
    <description>The latest articles on DEV Community by Rodrigo Castro (@redrodrigoc).</description>
    <link>https://dev.to/redrodrigoc</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%2F819310%2F7f973b37-8643-445f-98e2-a8ad2647e1c7.jpeg</url>
      <title>DEV Community: Rodrigo Castro</title>
      <link>https://dev.to/redrodrigoc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/redrodrigoc"/>
    <language>en</language>
    <item>
      <title>Você sabe como funcionam os super apps chineses? Um estudo com Flutter</title>
      <dc:creator>Rodrigo Castro</dc:creator>
      <pubDate>Sun, 13 Sep 2026 22:35:32 +0000</pubDate>
      <link>https://dev.to/redrodrigoc/voce-sabe-como-funcionam-os-super-apps-chineses-um-estudo-com-flutter-12jn</link>
      <guid>https://dev.to/redrodrigoc/voce-sabe-como-funcionam-os-super-apps-chineses-um-estudo-com-flutter-12jn</guid>
      <description>&lt;p&gt;Você já deve ter ouvido que "o WeChat é seu WhatsApp, seu banco e seu Uber, tudo no mesmo app". Essa comparação vende bem a ideia pra quem nunca usou um super app chinês, mas é só a superfície. Por trás dela existe uma decisão de arquitetura de software bem específica, que a maioria dos artigos sobre "super apps em Flutter" nunca chega a explicar: como um único aplicativo consegue rodar dezenas de milhares de serviços de terceiros sem que cada atualização passe pela App Store?&lt;/p&gt;

&lt;p&gt;Neste artigo eu saio do discurso de produto e vou direto pra arquitetura: como o WeChat, o Alipay e o Douyin resolvem isso tecnicamente, por que essa solução não é replicável com Flutter puro, e o que dá pra construir de fato quando o objetivo é ter vários serviços dentro do mesmo app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sumário
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;O que é, tecnicamente, um super app&lt;/li&gt;
&lt;li&gt;Por que não existe "Flutter dinâmico" dentro de um super app&lt;/li&gt;
&lt;li&gt;A arquitetura real: shell nativo, engine e JSBridge&lt;/li&gt;
&lt;li&gt;O que dá (e o que não dá) pra fazer com Flutter&lt;/li&gt;
&lt;li&gt;O que já existe pronto (e em produção) no ecossistema Flutter&lt;/li&gt;
&lt;li&gt;Quatro caminhos 100% Flutter pra mini-apps dinâmicos&lt;/li&gt;
&lt;li&gt;Conclusão&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  O que é, tecnicamente, um super app
&lt;/h2&gt;

&lt;p&gt;Um super app não é só "um app grande com muitas telas". É uma plataforma com três camadas bem definidas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Host / shell:&lt;/strong&gt; o app que o usuário baixa da loja. Cuida de autenticação, pagamentos, permissões de sistema (câmera, localização) e a navegação de topo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runtime de mini-programs:&lt;/strong&gt; um motor embarcado dentro do shell, capaz de executar código de terceiros de forma isolada e segura.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mini-programs:&lt;/strong&gt; os "apps dentro do app", desenvolvidos por times internos ou parceiros externos, publicados e atualizados sem passar pela App Store ou pela Play Store.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcjqtypva1a6smgkq3h7v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcjqtypva1a6smgkq3h7v.png" alt="Diagrama das três camadas de um super app: host/shell, runtime de mini-programs e os mini-programs individuais" width="800" height="621"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A peça que faz tudo funcionar é o runtime, e é exatamente aí que mora a pegadinha.&lt;/p&gt;




&lt;h2&gt;
  
  
  Por que não existe "Flutter dinâmico" dentro de um super app
&lt;/h2&gt;

&lt;p&gt;A primeira pergunta que todo dev Flutter faz é: dá pra empacotar cada mini-app como um módulo Dart e carregar isso dinamicamente, tipo dynamic feature modules do Android?&lt;/p&gt;

&lt;p&gt;Não, e o motivo não é técnico, é de política de loja. A &lt;a href="https://developer.apple.com/app-store/review/guidelines/" rel="noopener noreferrer"&gt;Guideline 2.5.2&lt;/a&gt; da Apple determina que um app precisa ser autocontido e não pode baixar, instalar ou executar código que introduza ou altere funcionalidades depois da revisão. Historicamente, a única brecha aceita era pra scripts interpretados rodando dentro do WebKit ou do JavaScriptCore embutidos no próprio iOS, desde que não mudassem o propósito principal do app declarado na loja. Um binário Dart compilado em AOT não se encaixa nessa brecha porque é código nativo, não interpretado por uma engine do sistema. Vale registrar que essa é uma área juridicamente sensível: a Apple já entrou em atrito público com a categoria de mini-programs mais de uma vez, e a fiscalização sobre esse tipo de download de código só ficou mais rígida nos últimos anos.&lt;/p&gt;

&lt;p&gt;É por isso que nenhum super app chinês executa Flutter, React Native ou qualquer framework compilado nativamente dentro dos seus mini-programs. Cada gigante resolveu isso com sua própria engine de script embarcada:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.wechat.com" rel="noopener noreferrer"&gt;WeChat&lt;/a&gt; (framework MINA):&lt;/strong&gt; separa a aplicação em duas threads. A camada de renderização (WXML/WXSS) roda dentro de uma WebView, enquanto a camada lógica (o JS do desenvolvedor) fica isolada numa thread JSCore, um motor JS puro, sem acesso a DOM ou &lt;code&gt;window&lt;/code&gt;. Essa separação existe por segurança, já que o código de terceiros nunca toca a UI diretamente, e por performance, porque a UI não trava esperando o JS de negócio processar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://global.alipay.com" rel="noopener noreferrer"&gt;Alipay&lt;/a&gt; (framework APPX + V8 Worker):&lt;/strong&gt; foi além. Cada mini-program roda seu próprio script de renderização (&lt;code&gt;index.js&lt;/code&gt;, executado em WebView) e seu próprio script de lógica de negócio (&lt;code&gt;index.worker.js&lt;/code&gt;, executado como Worker sobre uma engine V8 dedicada). Essa arquitetura permite inicializar a WebView e a engine V8 em paralelo, isola o JS do framework do JS do desenvolvedor em contextos V8 separados, e ainda expõe uma JSAPI pra plugins nativos se conectarem ao contexto de execução.&lt;/li&gt;
&lt;li&gt;Já o &lt;strong&gt;&lt;a href="https://www.douyin.com" rel="noopener noreferrer"&gt;Douyin&lt;/a&gt;&lt;/strong&gt; usa a mesma arquitetura de base do WeChat: a documentação oficial da plataforma de mini-programs do Douyin descreve o framework como dividido em camada lógica (JS Core) e camada de renderização (WebView), com uma linguagem de marcação própria (TTML/TTSS) equivalente ao WXML/WXSS do WeChat. Vale um adendo importante aqui: a ByteDance também abriu o código de um framework chamado &lt;strong&gt;Lynx&lt;/strong&gt;, com uma arquitetura de duas threads mais sofisticada (motor JS PrimJS, camada declarativa ReactLynx, bundler Rspeedy em Rust), e a própria empresa o posiciona como concorrente direto do React Native e do Flutter. Mas o Lynx resolve outro problema: ele é usado pra construir os &lt;strong&gt;próprios apps nativos&lt;/strong&gt; da ByteDance (o TikTok e o Douyin em si), não é o runtime que executa os mini-programs de terceiros dentro do Douyin.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O padrão que aparece nesses três casos é o mesmo: renderização e lógica de negócio rodam em threads ou contextos separados, e o código do mini-program é sempre interpretado em runtime por uma engine embarcada no shell. Nunca compilado nativamente e instalado como um binário à parte. Vale notar que Douyin e WeChat convergem quase pro mesmo modelo (JS Core + WebView), enquanto o Alipay foi o que mais se diferenciou tecnicamente, com a arquitetura V8 Worker rodando em paralelo.&lt;/p&gt;

&lt;p&gt;Vale um adendo: desde 2019 existe um grupo de trabalho do W3C, o MiniApps Working Group, com Alibaba, Baidu, Huawei e Xiaomi entre os participantes, tentando padronizar esse ecossistema fragmentado, definindo um formato comum de empacotamento, manifest e ciclo de vida pra mini-apps. Ainda não existe interoperabilidade real entre WeChat, Alipay e Douyin, mas isso já mostra que o problema é reconhecido como grande demais pra cada vendor resolver sozinho.&lt;/p&gt;




&lt;h2&gt;
  
  
  A arquitetura real: shell nativo, engine e JSBridge
&lt;/h2&gt;

&lt;p&gt;Descrevendo em camadas, um super app chinês típico se parece com isto:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8ina2c1iouy70twbo1lp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8ina2c1iouy70twbo1lp.png" alt="Diagrama mostrando o app shell com a engine de script, o bridge de comunicação e o mini-program bundle" width="800" height="576"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O componente crítico é o &lt;strong&gt;JSBridge&lt;/strong&gt;: uma camada de comunicação bidirecional entre o código JS do mini-program e o código nativo do shell. Quando um mini-program precisa abrir a câmera, ele não acessa o hardware diretamente. Ele chama uma função exposta pelo bridge, que delega pro código nativo, executa a operação e retorna o resultado de forma assíncrona, geralmente via &lt;code&gt;postMessage&lt;/code&gt; ou um canal equivalente ao &lt;code&gt;JavascriptChannel&lt;/code&gt; do &lt;code&gt;webview_flutter&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Isso resolve dois problemas de uma vez:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Segurança:&lt;/strong&gt; o mini-program nunca tem acesso irrestrito ao sistema, só ao que o bridge decide expor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Atualização independente:&lt;/strong&gt; como o mini-program é só um bundle JS/HTML baixado de um CDN, ele pode ser atualizado a qualquer momento sem passar por revisão de loja. É isso que permite ter dezenas de milhares deles rodando ao mesmo tempo.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  O que dá (e o que não dá) pra fazer com Flutter
&lt;/h2&gt;

&lt;p&gt;Aqui está a distinção mais importante do artigo, e que normalmente fica confusa: existem dois problemas diferentes escondidos atrás do termo "super app", e Flutter resolve muito bem um deles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problema 1: "quero um app só com muitos serviços internos, desenvolvidos e publicados pelo meu próprio time."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Isso é um monólito modular, e o Flutter é excelente nisso. Cada serviço vira um pacote Dart independente, organizado num monorepo com Melos, um formato de estrutura que já é padrão de mercado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;meu_super_app/
├── apps/
│   └── shell/              # app host
├── packages/
│   ├── core/               # DI, network, storage
│   ├── design_system/      # UI compartilhada
│   ├── carteira/
│   ├── chat/
│   └── perfil/
└── melos.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Um &lt;strong&gt;contrato comum&lt;/strong&gt; (&lt;code&gt;abstract class Module { routes(); dependencies(); initialize(); }&lt;/code&gt;) define como cada módulo se registra no shell.&lt;/li&gt;
&lt;li&gt;O &lt;strong&gt;roteamento é federado&lt;/strong&gt; com GoRouter: cada módulo expõe suas próprias rotas, o shell as agrega numa &lt;code&gt;GoRouter&lt;/code&gt; raiz, normalmente usando &lt;code&gt;ShellRoute&lt;/code&gt; pra manter uma navegação comum.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;comunicação entre módulos&lt;/strong&gt; nunca acontece por import direto, só por contratos definidos num pacote &lt;code&gt;shared&lt;/code&gt;, navegação por rota nomeada e um event bus (Stream ou um Bloc global de eventos) pra avisos assíncronos entre módulos que não se conhecem.&lt;/li&gt;
&lt;li&gt;Cada módulo mantém seu &lt;strong&gt;próprio escopo de estado&lt;/strong&gt; (Bloc, Cubit ou Riverpod), evitando vazamento de estado global.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O resultado: você ganha modularização, times trabalhando em paralelo, testes isolados por pacote. Mas tudo ainda é compilado e publicado como um único binário, numa única versão, numa única submissão de loja.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Problema 2: "quero permitir que terceiros publiquem serviços dentro do meu app, atualizáveis sem passar pela loja."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Esse é o problema que o WeChat resolve, e o Flutter não resolve nativamente. Pra chegar perto disso você precisaria de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Um shell Flutter (ou nativo) hospedando um &lt;code&gt;WebView&lt;/code&gt; ou uma engine JS embarcada, algo como o &lt;code&gt;flutter_js&lt;/code&gt;, que embute o QuickJS.&lt;/li&gt;
&lt;li&gt;Mini-apps como bundles de HTML, CSS e JS baixados de um servidor próprio.&lt;/li&gt;
&lt;li&gt;Um JSBridge implementado via &lt;code&gt;JavascriptChannel&lt;/code&gt; do &lt;code&gt;webview_flutter&lt;/code&gt;, expondo as APIs nativas que os mini-apps podem chamar.&lt;/li&gt;
&lt;li&gt;Um sistema de catálogo controlando quais mini-apps existem, suas versões e permissões.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nesse ponto a camada de UI dos seus mini-apps deixa de ser Flutter. Vira HTML e JS rodando dentro de uma WebView. Você está construindo, na prática, seu próprio mini runtime de mini-programs, não um app Flutter modular.&lt;/p&gt;




&lt;h2&gt;
  
  
  O que já existe pronto (e em produção) no ecossistema Flutter
&lt;/h2&gt;

&lt;p&gt;Antes de fechar, vale mostrar que parte desse problema já tem solução real no mundo Flutter, só que resolvendo pedaços diferentes dele.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FlutterBoost, da Alibaba:&lt;/strong&gt; é a peça que sustenta o "AliFlutter", a estratégia da própria Alibaba pra rodar Flutter em escala dentro do ecossistema de apps do grupo, incluindo o Xianyu (Idle Fish), um dos maiores apps Flutter em produção do mundo. A maioria dos apps da Alibaba usa uma pilha híbrida nativa mais Flutter, e o FlutterBoost existe justamente pra fazer telas nativas e telas Flutter conviverem no mesmo app, com uma única API de roteamento unificada e um canal de eventos (o BoostChannel) pra comunicação entre os dois lados. É o padrão mais próximo de "super app real em produção usando Flutter" que existe documentado, mas repare que ainda é modularização de containers dentro de um único binário, não mini-programs de terceiros publicados independentemente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shorebird:&lt;/strong&gt; esse é o mais interessante pro debate da regra 2.5.2. Ele criou um mecanismo de code push pra Flutter, embarcando um Flutter engine modificado que roda o código Dart através da Dart VM de forma interpretada, permitindo enviar patches de código pro app em produção sem passar pela revisão da loja. Funciona porque, tecnicamente, o app "release" enviado pra loja já contém a engine capaz de interpretar bytecode Dart. O patch não instala um executável novo, só atualiza o que a VM interpreta, caindo na mesma exceção histórica que permite JS interpretado. É a prova de que essa exceção da Apple não é exclusiva de JavaScript. Mas hoje o Shorebird resolve "meu time quer atualizar meu próprio app sem esperar a loja", não "quero permitir que terceiros publiquem mini-apps dentro do meu app". São problemas parecidos na superfície, mas com modelos de confiança bem diferentes: um mexe no seu próprio código, o outro precisa de sandboxing de código de terceiros.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Juntando os dois: hoje, com ferramentas maduras do próprio ecossistema Flutter, já dá pra montar um monólito modular com atualização mais rápida que o ciclo normal de loja. Isso cobre muito bem o primeiro problema. O segundo, mini-programs de terceiros de verdade, continua exigindo uma camada de engine de script separada, como fazem WeChat, Alipay e Douyin.&lt;/p&gt;




&lt;h2&gt;
  
  
  Quatro caminhos 100% Flutter pra mini-apps dinâmicos, e o trade-off de cada um
&lt;/h2&gt;

&lt;p&gt;Se o objetivo é ter mini-apps atualizáveis sem passar pela loja, mas sem sair do ecossistema Flutter, existem quatro caminhos reais.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Abordagem&lt;/th&gt;
&lt;th&gt;Como funciona&lt;/th&gt;
&lt;th&gt;Segurança jurídica (Apple)&lt;/th&gt;
&lt;th&gt;Performance/peso&lt;/th&gt;
&lt;th&gt;Consistência visual&lt;/th&gt;
&lt;th&gt;Maturidade&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pacotes Dart (monólito modular)&lt;/td&gt;
&lt;td&gt;Módulos compilados junto no binário, via monorepo e Melos&lt;/td&gt;
&lt;td&gt;Nenhum risco, é código nativo revisado normalmente&lt;/td&gt;
&lt;td&gt;Nativa, sem overhead&lt;/td&gt;
&lt;td&gt;Perfeita, é tudo Flutter nativo&lt;/td&gt;
&lt;td&gt;Alta, padrão de mercado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UI dirigida por dados (SDUI / GenUI SDK)&lt;/td&gt;
&lt;td&gt;Servidor envia um JSON descrevendo a tela, montado sobre um catálogo de widgets já compilados no app&lt;/td&gt;
&lt;td&gt;Nenhum risco, não há código sendo baixado, só dados (mesma categoria de remote config)&lt;/td&gt;
&lt;td&gt;Leve, só trafega JSON&lt;/td&gt;
&lt;td&gt;Perfeita, mas limitada ao catálogo de widgets já existente no app&lt;/td&gt;
&lt;td&gt;Padrão testado há anos fora do Flutter (Airbnb, Spotify); dentro do Flutter, oficializado pelo Google via GenUI SDK, ainda em alpha&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interpretador Dart (&lt;code&gt;dart_eval&lt;/code&gt;/&lt;code&gt;flutter_eval&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Bytecode Dart baixado e interpretado dentro do próprio app, renderizando widgets reais&lt;/td&gt;
&lt;td&gt;Zona cinzenta, os próprios mantenedores admitem incerteza e se apoiam no precedente do Hermes (React Native)&lt;/td&gt;
&lt;td&gt;De 10 a 50 vezes mais lento que Dart AOT, comparável a Ruby, só no código interpretado&lt;/td&gt;
&lt;td&gt;Perfeita, widgets Flutter reais&lt;/td&gt;
&lt;td&gt;Baixa/média, projeto jovem, cobertura parcial da linguagem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flutter Web dentro de WebView&lt;/td&gt;
&lt;td&gt;Mini-app compilado pra Flutter Web (CanvasKit/Wasm), carregado via &lt;code&gt;webview_flutter&lt;/code&gt; mais JSBridge&lt;/td&gt;
&lt;td&gt;Sólida, é exatamente a exceção nomeada na Guideline 2.5.2 pra conteúdo web em WebView&lt;/td&gt;
&lt;td&gt;Pesada, CanvasKit adiciona de 1.5 a 2MB de Wasm antes do primeiro pixel&lt;/td&gt;
&lt;td&gt;Alta, mas com as costuras clássicas de WebView (scroll, teclado, gestos)&lt;/td&gt;
&lt;td&gt;Alta, usa infraestrutura web madura, mas incomum nesse uso específico&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;O padrão que aparece na tabela não é uma linha reta simples entre "seguro e pesado" e "leve e arriscado". A UI dirigida por dados quebra essa lógica: ela é ao mesmo tempo a mais segura juridicamente e a mais leve tecnicamente, só que paga o preço em liberdade de expressão, não em performance ou compliance. Um mini-app SDUI não pode ter lógica de negócio própria nem widgets que o host não conhece de antemão. É ótimo pra telas guiadas, formulários, catálogos, checkouts simples, mas não serve pra um mini-program livre e arbitrário como os do WeChat.&lt;/p&gt;

&lt;p&gt;Pra um MVP ou uma POC de portfólio, isso muda a decisão. Pacotes Dart continuam sendo o caminho certo pro primeiro problema, o de modularização interna. Se a ideia é demonstrar o segundo problema, o de mini-apps de terceiros, de forma defensável e com esforço razoável, a UI dirigida por dados é provavelmente o ângulo mais interessante pra mostrar hoje: é recente (o GenUI SDK do Google é literalmente de 2026), resolve o problema de compliance de forma elegante, e ainda dá gancho pra falar de IA generativa compondo UI, que é assunto quente. Flutter Web em WebView continua sendo a opção mais robusta quando o mini-app precisa de liberdade total de lógica.&lt;/p&gt;




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

&lt;p&gt;"Super app" virou clichê de pitch de startup, mas por trás dele existem arquiteturas radicalmente diferentes. Se o objetivo é organizar um app grande com múltiplos serviços internos, o caminho é modularização séria: pacotes Dart, contratos, roteamento federado, event bus. Isso é 100% Flutter, sem gambiarra.&lt;/p&gt;

&lt;p&gt;Se o objetivo é replicar o modelo chinês de verdade, com um ecossistema de mini-programs de terceiros atualizáveis sem loja, você está resolvendo um problema de plataforma: engine de script embarcada, bridge nativo, sandboxing. E o Flutter vira só a camada do shell, não a camada onde os serviços rodam.&lt;/p&gt;

&lt;p&gt;Entender essa diferença antes de começar a arquitetar evita meses de decisões erradas. É esse tipo de clareza que separa uma implementação de portfólio de uma implementação de produção.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Este artigo é parte de um estudo prático que venho construindo em Flutter, explorando na prática os limites entre modularização de monólito e arquitetura real de mini-app.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Fontes técnicas: &lt;a href="https://developers.weixin.qq.com/miniprogram/en/dev/framework/" rel="noopener noreferrer"&gt;documentação oficial do WeChat Mini Program&lt;/a&gt;, &lt;a href="https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/framework/introduction" rel="noopener noreferrer"&gt;documentação oficial da plataforma de mini-programs do Douyin&lt;/a&gt;, &lt;a href="https://alibaba-cloud.medium.com/unveiling-the-secret-the-technology-evolution-of-the-alipay-mini-program-v8-worker-27ccfe96e2" rel="noopener noreferrer"&gt;artigo da Alibaba Cloud sobre o V8 Worker do Alipay&lt;/a&gt;, &lt;a href="https://github.com/alibaba/flutter_boost" rel="noopener noreferrer"&gt;repositório oficial do FlutterBoost no GitHub&lt;/a&gt;, &lt;a href="https://lynxjs.org" rel="noopener noreferrer"&gt;site oficial do Lynx&lt;/a&gt;, &lt;a href="https://www.w3.org/groups/wg/miniapps/" rel="noopener noreferrer"&gt;MiniApps Working Group do W3C&lt;/a&gt;, &lt;a href="https://docs.shorebird.dev" rel="noopener noreferrer"&gt;documentação do Shorebird sobre code push em Flutter&lt;/a&gt; e &lt;a href="https://docs.flutter.dev/ai/genui" rel="noopener noreferrer"&gt;documentação oficial do GenUI SDK for Flutter&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>flutter</category>
      <category>mobile</category>
      <category>architecture</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Rodrigo Castro</dc:creator>
      <pubDate>Fri, 05 Sep 2025 17:26:33 +0000</pubDate>
      <link>https://dev.to/redrodrigoc/-564m</link>
      <guid>https://dev.to/redrodrigoc/-564m</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/shayy/stop-building-for-scale-you-dont-have-users-yet-4aep" class="crayons-story__hidden-navigation-link"&gt;Stop Building for "Scale." You Don't Have Users Yet.&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/shayy" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2711665%2Fe528db00-6ac0-4654-b0d5-c68d84ed332e.png" alt="shayy profile" class="crayons-avatar__image" width="400" height="400"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/shayy" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Shayan
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Shayan
                
                
              
              &lt;div id="story-author-preview-content-2820232" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/shayy" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2711665%2Fe528db00-6ac0-4654-b0d5-c68d84ed332e.png" class="crayons-avatar__image" alt="" width="400" height="400"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Shayan&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/shayy/stop-building-for-scale-you-dont-have-users-yet-4aep" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Sep 4 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/shayy/stop-building-for-scale-you-dont-have-users-yet-4aep" id="article-link-2820232"&gt;
          Stop Building for "Scale." You Don't Have Users Yet.
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/shayy/stop-building-for-scale-you-dont-have-users-yet-4aep" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;79&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/shayy/stop-building-for-scale-you-dont-have-users-yet-4aep#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              15&lt;span class="hidden s:inline"&gt;&amp;nbsp;comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            6 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>webdev</category>
      <category>programming</category>
      <category>javascript</category>
      <category>ai</category>
    </item>
    <item>
      <title>Microserviços Everywhere? Talvez seja hora de conhecer o Monólito Modular</title>
      <dc:creator>Rodrigo Castro</dc:creator>
      <pubDate>Mon, 11 Aug 2025 20:35:20 +0000</pubDate>
      <link>https://dev.to/redrodrigoc/microservicos-everywhere-talvez-seja-hora-de-conhecer-o-monolito-modular-ki</link>
      <guid>https://dev.to/redrodrigoc/microservicos-everywhere-talvez-seja-hora-de-conhecer-o-monolito-modular-ki</guid>
      <description>&lt;p&gt;&lt;strong&gt;A arquitetura que combina o melhor dos dois mundos e pode salvar seu próximo projeto&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  O Hype dos Microserviços
&lt;/h2&gt;

&lt;p&gt;Vivemos em uma era onde falar de microserviços virou quase obrigatório em qualquer conversa sobre arquitetura de software. Netflix fez, Uber fez, então &lt;strong&gt;obviamente&lt;/strong&gt; seu projeto também deveria começar com microserviços, certo?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spoiler alert:&lt;/strong&gt; Provavelmente não.&lt;/p&gt;

&lt;p&gt;A realidade é que muitas empresas estão criando &lt;strong&gt;"microserviços distribuídos monolíticos"&lt;/strong&gt; - sistemas complexos, difíceis de debuggar e manter, que herdam as desvantagens dos microserviços sem colher os benefícios.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Síndrome do "Microserviços First"
&lt;/h2&gt;

&lt;p&gt;Vamos ser honestos: quantos projetos você conhece que começaram "fazendo a coisa certa" com microserviços e acabaram assim:&lt;/p&gt;

&lt;p&gt;❌ &lt;strong&gt;5 serviços para um MVP&lt;/strong&gt; que poderia ser uma única aplicação&lt;br&gt;&lt;br&gt;
❌ &lt;strong&gt;Transações distribuídas&lt;/strong&gt; para operações que deveriam ser atômicas&lt;br&gt;&lt;br&gt;
❌ &lt;strong&gt;Debugging infernal&lt;/strong&gt; espalhado por múltiplos logs&lt;br&gt;&lt;br&gt;
❌ &lt;strong&gt;Deploy complexo&lt;/strong&gt; desde o dia 1&lt;br&gt;&lt;br&gt;
❌ &lt;strong&gt;Time perdido&lt;/strong&gt; configurando infraestrutura ao invés de validar produto  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Premature optimization is the root of all evil"&lt;/em&gt; - Donald Knuth&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Começar com microserviços é &lt;strong&gt;otimização prematura de arquitetura&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Por Que NÃO Começar com Microserviços?
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. &lt;strong&gt;Você Não É a Netflix (Ainda)&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Netflix tem &lt;strong&gt;milhões de usuários simultâneos&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Você provavelmente tem &lt;strong&gt;dezenas ou centenas&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Eles têm &lt;strong&gt;centenas de desenvolvedores&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Você tem &lt;strong&gt;2-10 pessoas&lt;/strong&gt; no time&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  2. &lt;strong&gt;Complexidade Desnecessária&lt;/strong&gt;
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Monólito: 1 deploy, 1 banco, 1 log
Microserviços: N deploys, N bancos, N logs, N configurações
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Debugging Nightmare&lt;/strong&gt;
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bug no monólito: Stack trace completo
Bug em microserviços: "Qual serviço quebrou? Em que ordem?"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Over-engineering do MVP&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Você deveria estar &lt;strong&gt;validando seu produto&lt;/strong&gt;, não configurando Kubernetes.&lt;/p&gt;
&lt;h2&gt;
  
  
  Conheça o Monólito Modular
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;E se eu te disser que existe uma arquitetura que combina:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Simplicidade&lt;/strong&gt; do monólito para desenvolver e deployar&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Organização&lt;/strong&gt; dos microserviços para manter e escalar&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Flexibilidade&lt;/strong&gt; para evoluir gradualmente&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;Performance&lt;/strong&gt; de transações locais  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Essa arquitetura existe e se chama Monólito Modular.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Como Funciona?
&lt;/h2&gt;

&lt;p&gt;Imagine uma aplicação Laravel organizada assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;app/
├── Domains/
│   ├── User/          # Módulo de usuários
│   ├── Product/       # Módulo de produtos  
│   ├── Order/         # Módulo de pedidos
│   └── Payment/       # Módulo de pagamentos
├── Shared/            # Código compartilhado
└── Infrastructure/    # Concerns técnicos
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Características Principais:
&lt;/h3&gt;

&lt;p&gt;🔹 &lt;strong&gt;Um único aplicativo&lt;/strong&gt; - Deploy simples, debugging fácil&lt;br&gt;&lt;br&gt;
🔹 &lt;strong&gt;Módulos bem definidos&lt;/strong&gt; - Separação clara de responsabilidades&lt;br&gt;&lt;br&gt;
🔹 &lt;strong&gt;Comunicação via interfaces&lt;/strong&gt; - Baixo acoplamento&lt;br&gt;&lt;br&gt;
🔹 &lt;strong&gt;Banco de dados compartilhado&lt;/strong&gt; - ACID transactions&lt;br&gt;&lt;br&gt;
🔹 &lt;strong&gt;Migração gradual&lt;/strong&gt; - Evolução para microserviços quando necessário  &lt;/p&gt;
&lt;h2&gt;
  
  
  Vantagens Práticas
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Para o Time
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Onboarding rápido&lt;/strong&gt; - Nova pessoa entende a estrutura em horas&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Desenvolvimento ágil&lt;/strong&gt; - Mudanças rápidas sem coordenação entre times&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debugging simples&lt;/strong&gt; - Stack trace completo, logs centralizados&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Para o Negócio
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Time to market menor&lt;/strong&gt; - Foco no produto, não na infraestrutura&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custos reduzidos&lt;/strong&gt; - Menos complexidade = menos recursos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validação rápida&lt;/strong&gt; - Iterar rapidamente sobre features&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Para a Arquitetura
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Testabilidade&lt;/strong&gt; - Testes integrados simples&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consistência&lt;/strong&gt; - Transações ACID entre módulos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexibilidade&lt;/strong&gt; - Migration path claro para microserviços&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Quando Evoluir para Microserviços?
&lt;/h2&gt;

&lt;p&gt;O monolito modular oferece um &lt;strong&gt;migration path natural&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Fase 1: Monólito modular
├── Validar produto
├── Crescer time
└── Identificar gargalos

Fase 2: Extração gradual
├── Módulo Payment → Microserviço
├── Módulo Notification → Microserviço  
└── Core continua monólito

Fase 3: Microserviços completos
└── Quando realmente justificar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Sinais de que é hora de extrair:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Módulo&lt;/strong&gt; tem problemas de performance específicos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time grande&lt;/strong&gt; trabalhando no mesmo módulo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Escalabilidade&lt;/strong&gt; diferente entre módulos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tecnologia&lt;/strong&gt; específica seria melhor para um módulo&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Empresas que Usam (e Recomendam)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Shopify&lt;/strong&gt; - Monólito modular gigante que atende milhões&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt; - Rails monólito que escala massivamente
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Basecamp&lt;/strong&gt; - Defensores ferrenhos do monólito bem estruturado&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Laravel&lt;/strong&gt; (próprio framework) - Monólito modular por design&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"The monolith isn't dead. It's just well-designed."&lt;/em&gt; - DHH, Basecamp&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Implementação Prática
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Estrutura de um Módulo:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nc"&gt;Domains&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nc"&gt;Order&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nc"&gt;Models&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;           &lt;span class="c1"&gt;# Entidades do domínio&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nc"&gt;Services&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;         &lt;span class="c1"&gt;# Regras de negócio&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nc"&gt;Repositories&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;     &lt;span class="c1"&gt;# Acesso a dados&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nc"&gt;Events&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;           &lt;span class="c1"&gt;# Eventos do domínio&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nc"&gt;Http&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nc"&gt;Controllers&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;  &lt;span class="c1"&gt;# Controllers REST&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nc"&gt;Livewire&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;     &lt;span class="c1"&gt;# Componentes TALL&lt;/span&gt;
&lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nc"&gt;Tests&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;           &lt;span class="c1"&gt;# Testes do módulo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Comunicação Entre Módulos:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Via Service (síncrono)&lt;/span&gt;
&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;orderService&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;createOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Via Events (assíncrono) &lt;/span&gt;
&lt;span class="nc"&gt;OrderCreated&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$order&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusão: Comece Simples, Escale Gradualmente
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A pergunta não é:&lt;/strong&gt; "Microserviços ou Monólito?"&lt;br&gt;&lt;br&gt;
&lt;strong&gt;A pergunta é:&lt;/strong&gt; "Qual arquitetura me permite validar meu produto mais rápido?"&lt;/p&gt;

&lt;p&gt;O monólito modular oferece:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Simplicidade&lt;/strong&gt; para começar&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Estrutura&lt;/strong&gt; para crescer
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexibilidade&lt;/strong&gt; para evoluir&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Seu próximo projeto provavelmente deveria começar como um monólito modular.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Depois, quando você tiver:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Produto validado&lt;/li&gt;
&lt;li&gt;✅ Time maior&lt;/li&gt;
&lt;li&gt;✅ Problemas reais de escala&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Aí sim&lt;/strong&gt; considere microserviços.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;E você, já experimentou o monólito modular? Compartilhe sua experiência nos comentários! 👇&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>laravel</category>
      <category>microservices</category>
      <category>programming</category>
    </item>
    <item>
      <title>Observers no Laravel</title>
      <dc:creator>Rodrigo Castro</dc:creator>
      <pubDate>Sat, 26 Jul 2025 14:50:02 +0000</pubDate>
      <link>https://dev.to/redrodrigoc/observers-no-laravel-3aae</link>
      <guid>https://dev.to/redrodrigoc/observers-no-laravel-3aae</guid>
      <description>&lt;p&gt;Se você já trabalhou com Laravel, provavelmente já precisou executar algumas ações automaticamente quando algo acontece com seus models. Criar logs quando um usuário é cadastrado, enviar emails quando um pedido é finalizado, ou limpar cache quando um produto é atualizado.&lt;/p&gt;

&lt;p&gt;A solução mais óbvia seria colocar essa lógica diretamente nos controllers ou nos próprios models. Mas convenhamos, isso vira uma bagunça rapidinho.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Laravel Observers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Os Observers são como aquele amigo atento que sempre sabe quando algo acontece e age automaticamente. Eles "observam" os eventos do Eloquent (created, updated, deleted, etc.) e executam código específico para cada situação.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Na prática, como funciona?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imagine que você tem um model User e quer enviar um email de boas-vindas sempre que alguém se cadastra:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fodlrmj9o4j559s2nc1p6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fodlrmj9o4j559s2nc1p6.png" alt=" " width="800" height="918"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Depois é só registrar no AppServiceProvider:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpbpcpdybtxyxni4uq95g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpbpcpdybtxyxni4uq95g.png" alt=" " width="800" height="344"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Por que usar Observers?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Primeiro, seu código fica muito mais organizado. Toda a lógica relacionada aos eventos do model fica concentrada em um lugar só. Segundo, você segue o princípio da responsabilidade única - o controller cuida da requisição, o model cuida dos dados, e o observer cuida dos efeitos colaterais. Terceiro ponto: testabilidade. É muito mais fácil testar um observer isoladamente do que toda a stack junta.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dica de ouro&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use observers para ações que sempre devem acontecer, independente de onde o model foi alterado. Se a ação é específica de um contexto (tipo "enviar email só quando o admin cadastra"), talvez seja melhor manter no controller mesmo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusão&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Os Observers são uma ferramenta poderosa para manter seu código Laravel limpo e organizável. Eles transformam aqueles "lembretes mentais" de executar certas ações em código automático e confiável.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>laravel</category>
      <category>php</category>
      <category>programming</category>
    </item>
    <item>
      <title>Design System no Flutter</title>
      <dc:creator>Rodrigo Castro</dc:creator>
      <pubDate>Mon, 22 Jul 2024 18:01:57 +0000</pubDate>
      <link>https://dev.to/redrodrigoc/design-system-no-flutter-4d53</link>
      <guid>https://dev.to/redrodrigoc/design-system-no-flutter-4d53</guid>
      <description>&lt;p&gt;O desenvolvimento de aplicativos móveis eficazes requer não apenas uma base sólida em termos de funcionalidades, mas também uma abordagem coesa e consistente para o design da interface do usuário. Um Design System é fundamental para atingir esse objetivo, oferecendo um conjunto de padrões reutilizáveis e modularizados que promovem a consistência, eficiência e escalabilidade.&lt;/p&gt;

&lt;h3&gt;
  
  
  O que é um Design System?
&lt;/h3&gt;

&lt;p&gt;Um Design System é um conjunto de padrões e componentes reutilizáveis que auxiliam no desenvolvimento de UIs padronizadas, bonitas e obviamente garantindo uma experiência consistente todas as partes de um produto Digital. No Flutter (ou em qualquer outro frontend), o design system faz com que nós devs foquemos mais em solucionar os requisitos funcionais e menos em construir as mesmas telas padronizadas para o nosso aplicativo. &lt;/p&gt;

&lt;p&gt;1 - &lt;strong&gt;Configurando o projeto&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Primeiro vamos criar um novo projeto, podemos criar dentro da pasta principal do app e/ou criar um package externo para ser reutilizável.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;flutter create &lt;span class="nt"&gt;--template&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;package design_system
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso cria a estrutura básica do package onde você pode começar a adicionar seus componentes e estilos.&lt;/p&gt;

&lt;p&gt;2 - &lt;strong&gt;Definindo as diretrizes de design&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Antes de começar a codar, defina as diretrizes de design que seu sistema seguirá. Isso inclui:&lt;br&gt;
    - &lt;strong&gt;Paleta de Cores&lt;/strong&gt;: Defina cores primárias, secundárias, de fundo, de texto, etc.&lt;br&gt;
    - &lt;strong&gt;Tipografia&lt;/strong&gt;: Escolha fontes, tamanhos e estilos de texto.&lt;br&gt;
    - &lt;strong&gt;Componentes Personalizáveis&lt;/strong&gt;: Flutter permite criar componentes altamente personalizáveis e reutilizáveis.&lt;/p&gt;

&lt;p&gt;3 - &lt;strong&gt;Estruturando o package&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Organize seu package de maneira que seja fácil de entender e manter. Uma estrutura comum pode ser:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;lib&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;src&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;components&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="nc"&gt;.dart&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;theme&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;colors&lt;/span&gt;&lt;span class="nc"&gt;.dart&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;├──&lt;/span&gt; &lt;span class="nt"&gt;text_styles&lt;/span&gt;&lt;span class="nc"&gt;.dart&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;theme&lt;/span&gt;&lt;span class="nc"&gt;.dart&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;   &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;utils&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="err"&gt;│&lt;/span&gt;       &lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;spacing&lt;/span&gt;&lt;span class="nc"&gt;.dart&lt;/span&gt;
&lt;span class="err"&gt;└──&lt;/span&gt; &lt;span class="nt"&gt;design_system&lt;/span&gt;&lt;span class="nc"&gt;.dart&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4 - &lt;strong&gt;Criando paleta de cores&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No arquivo &lt;code&gt;lib/src/theme/colors.dart&lt;/code&gt;, defina sua paleta de cores:&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:flutter/material.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AppColors&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Color&lt;/span&gt; &lt;span class="n"&gt;primary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0xFF6200EE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Color&lt;/span&gt; &lt;span class="n"&gt;primaryVariant&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0xFF3700B3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Color&lt;/span&gt; &lt;span class="n"&gt;secondary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0xFF03DAC6&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Color&lt;/span&gt; &lt;span class="n"&gt;secondaryVariant&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0xFF018786&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Color&lt;/span&gt; &lt;span class="n"&gt;background&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0xFFFFFFFF&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Color&lt;/span&gt; &lt;span class="n"&gt;surface&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0xFFFFFFFF&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Color&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0xFFB00020&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Color&lt;/span&gt; &lt;span class="n"&gt;onPrimary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0xFFFFFFFF&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Color&lt;/span&gt; &lt;span class="n"&gt;onSecondary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0xFF000000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Color&lt;/span&gt; &lt;span class="n"&gt;onBackground&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0xFF000000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Color&lt;/span&gt; &lt;span class="n"&gt;onSurface&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0xFF000000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Color&lt;/span&gt; &lt;span class="n"&gt;onError&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0xFFFFFFFF&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;blockquote&gt;
&lt;p&gt;No flutter &lt;code&gt;0xFF&lt;/code&gt; representa uma cor hexadecimal&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;5 - &lt;strong&gt;Definindo estilos de texto&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No arquivo &lt;code&gt;lib/src/theme/text_styles.dart&lt;/code&gt;, defina seus estilos de texto:&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:flutter/material.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TextStyles&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;TextStyle&lt;/span&gt; &lt;span class="n"&gt;headline1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TextStyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nl"&gt;fontSize:&lt;/span&gt; &lt;span class="mi"&gt;96&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;fontWeight:&lt;/span&gt; &lt;span class="n"&gt;FontWeight&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;bold&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;color:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;black&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;TextStyle&lt;/span&gt; &lt;span class="n"&gt;bodyText1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TextStyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nl"&gt;fontSize:&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;color:&lt;/span&gt; &lt;span class="n"&gt;Colors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;black&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="c1"&gt;// Adicione mais estilos conforme necessário&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;6 - &lt;strong&gt;Criando um tema&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No arquivo &lt;code&gt;lib/src/theme/theme.dart&lt;/code&gt;, defina seu tema:&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:flutter/material.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'colors.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'text_styles.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AppTheme&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="n"&gt;ThemeData&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="n"&gt;lightTheme&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;ThemeData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;primaryColor:&lt;/span&gt; &lt;span class="n"&gt;AppColors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;primaryColorLight:&lt;/span&gt; &lt;span class="n"&gt;AppColors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;primaryVariant&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;textTheme:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;TextTheme&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;displayLarge:&lt;/span&gt; &lt;span class="n"&gt;TextStyles&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;headline1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nl"&gt;bodyLarge:&lt;/span&gt; &lt;span class="n"&gt;TextStyles&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;bodyText1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="nl"&gt;colorScheme:&lt;/span&gt; &lt;span class="n"&gt;ColorScheme&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromSwatch&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;copyWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;secondary:&lt;/span&gt; &lt;span class="n"&gt;AppColors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;secondary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nl"&gt;surface:&lt;/span&gt; &lt;span class="n"&gt;AppColors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;background&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;

      &lt;span class="c1"&gt;// Adicione mais customizações conforme necessário&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;7 - &lt;strong&gt;Criando componentes reutilizáveis&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No arquivo &lt;code&gt;lib/src/components/button.dart&lt;/code&gt;, crie um componente de botão personalizado:&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:flutter/material.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'../theme/colors.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CustomButton&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatelessWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;label&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;VoidCallback&lt;/span&gt; &lt;span class="n"&gt;onPressed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;CustomButton&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;required&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;required&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onPressed&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ElevatedButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;style:&lt;/span&gt; &lt;span class="n"&gt;ElevatedButton&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;styleFrom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;backgroundColor:&lt;/span&gt; &lt;span class="n"&gt;AppColors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;primary&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nl"&gt;padding:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;EdgeInsets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;symmetric&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;vertical:&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;horizontal:&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="c1"&gt;// Adicione mais propriedades de estilo conforme necessário&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="nl"&gt;onPressed:&lt;/span&gt; &lt;span class="n"&gt;onPressed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nl"&gt;style:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;TextStyle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;color:&lt;/span&gt; &lt;span class="n"&gt;AppColors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onPrimary&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;8 - &lt;strong&gt;Exportando seu design system&lt;/strong&gt;&lt;br&gt;
No arquivo &lt;code&gt;lib/design_system.dart&lt;/code&gt;, exporte todas as suas definições:&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;library&lt;/span&gt; &lt;span class="n"&gt;design_system&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;export&lt;/span&gt; &lt;span class="s"&gt;'src/components/button.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;export&lt;/span&gt; &lt;span class="s"&gt;'src/theme/colors.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;export&lt;/span&gt; &lt;span class="s"&gt;'src/theme/text_styles.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;export&lt;/span&gt; &lt;span class="s"&gt;'src/theme/theme.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;9 - &lt;strong&gt;Usando o Design System em um projeto&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;dependencies&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;flutter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;sdk&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;flutter&lt;/span&gt;
  &lt;span class="na"&gt;design_system&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./design_system&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em seu projeto, importe e utilize o Design System:&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:flutter/material.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:design_system/design_system.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;runApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;MyApp&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;MyApp&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;StatelessWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;MaterialApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;theme:&lt;/span&gt; &lt;span class="n"&gt;AppTheme&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lightTheme&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;home:&lt;/span&gt; &lt;span class="n"&gt;Scaffold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;appBar:&lt;/span&gt; &lt;span class="n"&gt;AppBar&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Design System Example'&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;Center&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;CustomButton&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="nl"&gt;label:&lt;/span&gt; &lt;span class="s"&gt;'Press Me'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="nl"&gt;onPressed:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
          &lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fupis1w5swyhlka4tohtp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fupis1w5swyhlka4tohtp.png" alt="Exemplo do design system" width="800" height="1644"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Criar um Design System no Flutter permite uma estrutura modular e reutilizável. Isso facilita a manutenção e a escalabilidade do seu aplicativo, garantindo uma experiência de usuário consistente e de alta qualidade. Com as diretrizes e componentes bem definidos, você pode rapidamente aplicar seu Design System em diferentes projetos e manter a uniformidade visual e funcional.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>designsystem</category>
      <category>braziliandevs</category>
      <category>dart</category>
    </item>
    <item>
      <title>Server Driven UI no Flutter?</title>
      <dc:creator>Rodrigo Castro</dc:creator>
      <pubDate>Wed, 29 May 2024 11:04:15 +0000</pubDate>
      <link>https://dev.to/redrodrigoc/server-driven-ui-no-flutter-367d</link>
      <guid>https://dev.to/redrodrigoc/server-driven-ui-no-flutter-367d</guid>
      <description>&lt;p&gt;O &lt;strong&gt;Server Driven UI&lt;/strong&gt; (SDUI) no Flutter surge como um &lt;strong&gt;game-changer&lt;/strong&gt; no cenário do desenvolvimento de aplicativos. Ao transferir a lógica da interface para o servidor, abre-se um universo de possibilidades para criar interfaces mais dinâmicas, personalizadas e eficientes. Imagine um app que se adapta em tempo real às suas necessidades, sem a necessidade de constantes atualizações. É isso e muito mais que o SDUI no Flutter oferece!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;game-changer&lt;/strong&gt; se refere a um “divisor de águas”, ou seja, algo que revoluciona e muda completamente um determinado mercado ou situação.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  O que é Server Driven UI?
&lt;/h3&gt;

&lt;p&gt;Em contraste com a abordagem tradicional, onde a interface do usuário (UI) é definida no cliente (aplicativo móvel), o SDUI transfere a responsabilidade para o servidor. Isso significa que o servidor gera e envia a estrutura da UI para o aplicativo, que a renderiza na tela do dispositivo. Essa inversão de controle traz diversos benefícios:&lt;/p&gt;

&lt;h4&gt;
  
  
  Maior Agilidade e Flexibilidade:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Desenvolvimento e testes mais rápidos&lt;/strong&gt;: Alterações na UI podem ser implementadas no servidor e propagadas instantaneamente para todos os usuários, sem a necessidade de atualizações de aplicativos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Experiência do usuário aprimorada&lt;/strong&gt;: A UI pode ser personalizada em tempo real, de acordo com o perfil e contexto de cada usuário.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Redução de custos de desenvolvimento&lt;/strong&gt;: O código da UI é centralizado no servidor, diminuindo a duplicação de esforços e otimizando o processo de desenvolvimento.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mas nem tudo são flores...&lt;/p&gt;

&lt;h4&gt;
  
  
  Desafios e Considerações:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Implementação&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Arquitetura robusta&lt;/strong&gt;: O servidor precisa ter capacidade de processar e enviar as informações da UI de forma eficiente, especialmente para um grande número de usuários simultâneos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comunicação confiável&lt;/strong&gt;: A comunicação entre o servidor e o aplicativo deve ser segura e resiliente a falhas de rede.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Segurança de dados&lt;/strong&gt;: É crucial implementar medidas de segurança rigorosas para proteger os dados dos usuários e evitar acessos não autorizados.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Experiência do usuário&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Latência&lt;/strong&gt;: A latência na comunicação entre o servidor e o aplicativo pode afetar a fluidez da UI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conectividade&lt;/strong&gt;: O SDUI depende de uma conexão de internet estável para funcionar corretamente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Acessibilidade&lt;/strong&gt;: É importante garantir que a UI gerada pelo servidor seja acessível a todos os usuários, incluindo aqueles com deficiências.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  Exemplos de Bibliotecas SDUI para Flutter:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Mirai&lt;/li&gt;
&lt;li&gt;server_driven_ui &lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Exemplo utilizando o Mirai:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Servidor&lt;/strong&gt;:&lt;br&gt;
&lt;/p&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"scaffold"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"appBar"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"appBar"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"title"&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="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Cards"&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;"body"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"column"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"mainAxisAlignment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"start"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"crossAxisAlignment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"center"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"children"&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="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sizedBox"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"height"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"card"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"elevation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"borderOnForeground"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"margin"&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="nl"&gt;"top"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"bottom"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"right"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"left"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"child"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"listTile"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"leading"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"image"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"src"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://avatars.githubusercontent.com/u/31713982?v=4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"width"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"height"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50&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;"title"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"padding"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"padding"&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="nl"&gt;"top"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"child"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Rodrigo Castro"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"align"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"center"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"style"&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="nl"&gt;"fontSize"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;21&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;"subtitle"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"padding"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"padding"&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="nl"&gt;"top"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"bottom"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"child"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="s2"&gt;"Desenvolvedor de Software com foco em Laravel e Flutter. (Open to Work)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"align"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"center"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"style"&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="nl"&gt;"fontSize"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&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="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="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Flutter&lt;/strong&gt;:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqkvkaz9aggmei4dw0rji.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqkvkaz9aggmei4dw0rji.png" alt="Exemplo no flutter" width="800" height="996"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3b54w11gcvmq2q4ivztx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3b54w11gcvmq2q4ivztx.png" alt="Tela do app" width="800" height="1644"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Conclusão:
&lt;/h4&gt;

&lt;p&gt;O SDUI no Flutter se apresenta como uma ferramenta poderosa para impulsionar a inovação e criar experiências de usuário excepcionais. Ao abraçar essa abordagem com cautela e planejamento estratégico, os desenvolvedores terão a oportunidade de revolucionar o cenário de desenvolvimento de aplicativos.&lt;/p&gt;

&lt;h4&gt;
  
  
  Para se aprofundar no assunto:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://robertocsd.medium.com/unraveling-sdui-a-deep-dive-into-server-driven-user-interfaces-using-mirai-in-flutter-e99cd3c81abe" rel="noopener noreferrer"&gt;Artigo "Server Driven UI with Mirai in Flutter"&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://m.youtube.com/watch?v=sWIS18Njr3I" rel="noopener noreferrer"&gt;Vídeo "Flutter Server Driven UI é possível? Descubra neste vídeo!"&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pub.dev/packages/server_driven_ui" rel="noopener noreferrer"&gt;Pacote "server_driven_ui" no Pub.dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pub.dev/packages/mirai" rel="noopener noreferrer"&gt;Pacote "mirai" no Pub.dev&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>braziliandevs</category>
      <category>flutter</category>
      <category>dart</category>
      <category>programming</category>
    </item>
    <item>
      <title>Como abstrair sua aplicação flutter para não depender de packages</title>
      <dc:creator>Rodrigo Castro</dc:creator>
      <pubDate>Fri, 17 May 2024 15:52:45 +0000</pubDate>
      <link>https://dev.to/redrodrigoc/como-abstrair-sua-aplicacao-flutter-para-nao-depender-de-packages-1k68</link>
      <guid>https://dev.to/redrodrigoc/como-abstrair-sua-aplicacao-flutter-para-nao-depender-de-packages-1k68</guid>
      <description>&lt;p&gt;Flutter, o framework de UI do Google para criar aplicativos multiplataforma, é conhecido por sua extensa coleção de pacotes que simplificam o desenvolvimento. No entanto, confiar demais em pacotes pode tornar seu projeto vulnerável a problemas como descontinuação de pacotes, falta de manutenção ou incompatibilidades futuras. Abstrair sua aplicação para minimizar a dependência de pacotes pode aumentar a longevidade e a estabilidade do seu projeto. Neste artigo, vamos explorar estratégias para alcançar isso.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tópicos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Entenda suas Necessidades&lt;/li&gt;
&lt;li&gt;Use Interfaces para Abstração&lt;/li&gt;
&lt;li&gt;Implementação Própria de Funcionalidades Simples&lt;/li&gt;
&lt;li&gt;Módulos de Serviço&lt;/li&gt;
&lt;li&gt;Conclusão&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Entenda Suas Necessidades
&lt;/h2&gt;

&lt;p&gt;Antes de decidir abstrair seu aplicativo, é crucial entender as necessidades específicas do seu projeto. Nem todos os pacotes são iguais e alguns fornecem funcionalidades complexas que podem ser difíceis de replicar. Avalie se a funcionalidade fornecida pelo pacote é algo que você pode ou deve implementar por conta própria. &lt;br&gt;
Pergunte-se:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Este pacote é crucial para a funcionalidade principal do meu aplicativo?&lt;/li&gt;
&lt;li&gt;A funcionalidade é complexa ou pode ser implementada com uma solução personalizada?&lt;/li&gt;
&lt;li&gt;O pacote tem uma alta probabilidade de ser descontinuado?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Com essas informações em mãos, podemos elaborar algumas estratégias para o seu desacoplamento:&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Interfaces para Abstração
&lt;/h2&gt;

&lt;p&gt;Uma das melhores práticas para reduzir a dependência de pacotes é usar interfaces para definir a funcionalidade necessária. Em vez de depender diretamente de uma implementação de um pacote, você pode definir uma interface que descreve o comportamento necessário e, em seguida, fornecer uma implementação concreta que utiliza o pacote.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Definindo a interface&lt;/span&gt;
&lt;span class="kd"&gt;abstract&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;LocalStorage&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="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;saveData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;value&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="kt"&gt;String&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;getData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Implementação usando um pacote (por exemplo, SharedPreferences)&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SharedPreferencesStorage&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="n"&gt;LocalStorage&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;SharedPreferences&lt;/span&gt; &lt;span class="n"&gt;_prefs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="n"&gt;SharedPreferencesStorage&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;_prefs&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;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;saveData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;value&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;await&lt;/span&gt; &lt;span class="n"&gt;_prefs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="n"&gt;Future&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="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;getData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;key&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;return&lt;/span&gt; &lt;span class="n"&gt;_prefs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dessa forma, você pode facilmente substituir &lt;code&gt;SharedPreferencesStorage&lt;/code&gt; por outra implementação sem alterar o restante do código que depende de &lt;code&gt;LocalStorage&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementação Própria de Funcionalidades Simples
&lt;/h2&gt;

&lt;p&gt;Para funcionalidades simples, considere implementar você mesmo em vez de usar um pacote. Por exemplo, se você precisa apenas de uma solução simples de cache ou armazenamento local, pode ser mais fácil escrever sua própria implementação do que depender de um pacote.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo de Cache Simples
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Define a classe SimpleCache&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SimpleCache&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="c1"&gt;// Cria um mapa privado para armazenar pares de chave-valor  &lt;/span&gt;
  &lt;span class="kd"&gt;final&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="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_cache&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
&lt;span class="c1"&gt;// Método para adicionar dados ao cache&lt;/span&gt;
  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;saveData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;_cache&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// Método para recuperar dados do cache&lt;/span&gt;
  &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;getData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;key&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;_cache&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&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;h2&gt;
  
  
  Módulos de Serviço
&lt;/h2&gt;

&lt;p&gt;Separar a lógica de negócios em módulos de serviço pode ajudar a reduzir a dependência de pacotes. Esses módulos podem fornecer abstração sobre qualquer funcionalidade de terceiros, permitindo que você mude facilmente a implementação sem impactar outras partes do código.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Define a classe AuthService&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AuthService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Cria uma instância privada de FirebaseAuth&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;FirebaseAuth&lt;/span&gt; &lt;span class="n"&gt;_firebaseAuth&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Construtor que aceita uma instância de FirebaseAuth&lt;/span&gt;
  &lt;span class="n"&gt;AuthService&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;_firebaseAuth&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Método para autenticar um usuário com email e senha&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;User&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;signIn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;password&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;// Tenta autenticar o usuário com email e senha&lt;/span&gt;
      &lt;span class="n"&gt;UserCredential&lt;/span&gt; &lt;span class="n"&gt;userCredential&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;_firebaseAuth&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;signInWithEmailAndPassword&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;email:&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;password:&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="c1"&gt;// Se a autenticação for bem-sucedida, retorna o User&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;userCredential&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;user&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;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Se ocorrer um erro, imprime o erro e retorna null&lt;/span&gt;
      &lt;span class="n"&gt;print&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;$e&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;return&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="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Método para deslogar o usuário atual&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;signOut&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;await&lt;/span&gt; &lt;span class="n"&gt;_firebaseAuth&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;signOut&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui, &lt;code&gt;AuthService&lt;/code&gt; abstrai a implementação do &lt;code&gt;FirebaseAuth&lt;/code&gt;, permitindo que você substitua facilmente &lt;code&gt;_firebaseAuth&lt;/code&gt; por outra solução de autenticação no futuro.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gerenciamento de Estado Independente de Pacotes
&lt;/h2&gt;

&lt;p&gt;O gerenciamento de estado é uma área onde muitos desenvolvedores dependem de pacotes como Provider, Bloc ou Riverpod. No entanto, é possível gerenciar o estado de forma eficiente sem depender de pacotes externos, utilizando apenas as funcionalidades nativas do Flutter, como &lt;code&gt;InheritedWidget&lt;/code&gt;, &lt;code&gt;ChangeNotifier&lt;/code&gt; e &lt;code&gt;ValueNotifier&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo usando &lt;code&gt;ChangeNotifier&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Define a classe Counter que notifica os ouvintes quando o valor do contador muda&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Counter&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;ChangeNotifier&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Inicializa o contador como 0&lt;/span&gt;
  &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Getter para obter o valor atual do contador&lt;/span&gt;
  &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_count&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Método para incrementar o contador&lt;/span&gt;
  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;_count&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// Incrementa o contador&lt;/span&gt;
    &lt;span class="n"&gt;notifyListeners&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// Notifica os ouvintes sobre a mudança&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Define a classe CounterProvider que fornece uma instância de Counter para seus descendentes&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CounterProvider&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;InheritedWidget&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Mantém uma referência para a instância de Counter&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;Counter&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Construtor que aceita um filho e uma instância de Counter&lt;/span&gt;
  &lt;span class="n"&gt;CounterProvider&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="n"&gt;Key&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;required&lt;/span&gt; &lt;span class="n"&gt;Widget&lt;/span&gt; &lt;span class="n"&gt;child&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;required&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;key:&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;child:&lt;/span&gt; &lt;span class="n"&gt;child&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Método para obter a instância mais próxima de CounterProvider na árvore de widgets&lt;/span&gt;
  &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="n"&gt;CounterProvider&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BuildContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dependOnInheritedWidgetOfExactType&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;CounterProvider&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Método para determinar se este widget deve notificar seus descendentes quando é reconstruído&lt;/span&gt;
  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;updateShouldNotify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CounterProvider&lt;/span&gt; &lt;span class="n"&gt;oldWidget&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Retorna true se a instância de Counter mudou&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;oldWidget&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;counter&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;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Abstrair sua aplicação Flutter para não depender de pacotes envolve um equilíbrio entre reutilização de código e a criação de uma base sólida e independente. Usando interfaces, implementando funcionalidades simples por conta própria e separando a lógica em módulos de serviço, você pode reduzir a dependência de pacotes externos e aumentar a flexibilidade e a longevidade do seu projeto. Adotar essas práticas pode exigir um esforço adicional no início, mas os benefícios a longo prazo de um código mais limpo e sustentável valem a pena.&lt;/p&gt;

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