<?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: Cristian Dornelles</title>
    <description>The latest articles on DEV Community by Cristian Dornelles (@cdornelles).</description>
    <link>https://dev.to/cdornelles</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F197395%2F68925fb8-bf0e-4b22-92cd-72f65f9ad21d.jpg</url>
      <title>DEV Community: Cristian Dornelles</title>
      <link>https://dev.to/cdornelles</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cdornelles"/>
    <language>en</language>
    <item>
      <title>Deep Links em Flutter: O Guia Definitivo para Iniciantes (Sem Pacotes de Terceiros) (Parte 1)</title>
      <dc:creator>Cristian Dornelles</dc:creator>
      <pubDate>Sat, 04 Apr 2026 18:59:27 +0000</pubDate>
      <link>https://dev.to/cdornelles/deep-links-em-flutter-o-guia-definitivo-para-iniciantes-sem-pacotes-de-terceiros-parte-1-4a31</link>
      <guid>https://dev.to/cdornelles/deep-links-em-flutter-o-guia-definitivo-para-iniciantes-sem-pacotes-de-terceiros-parte-1-4a31</guid>
      <description>&lt;p&gt;Imagine isso: seu usuário recebe um link de desconto, clica nele — e BOOM! Ele não só abre seu app, mas já está na tela de checkout com o cupom aplicado. Isso é mágica? Não — são Deep Links!&lt;/p&gt;

&lt;p&gt;Este é o primeiro conteúdo de uma série completa sobre Deep Links no Flutter, com novos artigos saindo semanalmente, ou quase. Vamos entender os conceitos fundamentais, explorar os diferentes tipos e preparar a estrutura base do nosso projeto do zero, sem depender de pacotes de terceiros.&lt;/p&gt;

&lt;p&gt;Ao longo desta série, vou te mostrar como implementar deep links em Flutter — sem utilizar pacotes prontos. Por quê? Porque você vai aprender exatamente como tudo funciona por baixo dos panos.&lt;/p&gt;




&lt;p&gt;Neste artigo, você vai aprender:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;O que são deep links.&lt;/li&gt;
&lt;li&gt;Diferença entre App Links e Custom Schemes.&lt;/li&gt;
&lt;li&gt;Como estruturar a base no Flutter.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  O que são Deep Links?
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Deep links&lt;/em&gt; são URLs que levam o usuário diretamente para uma tela específica do seu app, em vez de abrir no navegador.&lt;/p&gt;

&lt;p&gt;Exemplo real:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fluxo tradicional&lt;/strong&gt;: Abre navegador → usuário instala o app → abre → navega até a tela.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deep link&lt;/strong&gt;: Abre o app diretamente na tela correta.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para termos uma visão completa, o diagrama abaixo ilustra o roteamento (conhecido como &lt;em&gt;Deferred Deep Linking&lt;/em&gt;), onde — até mesmo se o usuário não tiver o app — o contexto do link é preservado após ele passar pelas lojas de apps:&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%2Fiviwp8xhrpjpeu5t7jxv.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%2Fiviwp8xhrpjpeu5t7jxv.png" alt="Fluxo completo" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fluxo completo&lt;/p&gt;

&lt;p&gt;Esse fluxo completo, onde o usuário pode instalar o app e ainda assim manter o contexto original do link, é o que chamamos de &lt;strong&gt;Deferred Deep Linking&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Anatomia de um Deep Link
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://fitconnect.app/signup?referralCode=TRAINER12345
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scheme&lt;/strong&gt;: &lt;code&gt;https&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Host&lt;/strong&gt;: &lt;code&gt;fitconnect.app&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Path&lt;/strong&gt;: &lt;code&gt;/signup&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Query&lt;/strong&gt;: &lt;code&gt;?referralCode=TRAINER12345&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cada parte dessa estrutura tem um papel específico na navegação. O scheme identifica o protocolo (ou, no caso de custom schemes, o aplicativo), o host e o path determinam a rota, e os query parameters carregam dados extras (como um código de indicação — referralCode).&lt;/p&gt;




&lt;h2&gt;
  
  
  Tipos de Deep Links
&lt;/h2&gt;

&lt;p&gt;Existem dois tipos principais e a escolha entre eles tem implicações diretas na segurança e na experiência do usuário.&lt;/p&gt;

&lt;h3&gt;
  
  
  Custom Schemes (&lt;code&gt;fitconnect://&lt;/code&gt;)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fitconnect://fitconnect.app/signup?referralCode=TRAINER12345
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;✅ Rápido de implementar.&lt;/li&gt;
&lt;li&gt;✅ Ótimo para testes locais.&lt;/li&gt;
&lt;li&gt;⚠️ Menos seguro — qualquer aplicativo pode registrar o mesmo scheme.&lt;/li&gt;
&lt;li&gt;⚠️ Se o app não estiver instalado, o sistema exibe um erro feio.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  App Links (Android) / Universal Links (iOS)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://fitconnect.app/signup?referralCode=TRAINER12345
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;✅ Seguro — verificação bidirecional entre aplicativo e servidor.&lt;/li&gt;
&lt;li&gt;✅ Se o app não estiver instalado, abre normalmente no navegador.&lt;/li&gt;
&lt;li&gt;✅ Recomendado para produção.&lt;/li&gt;
&lt;li&gt;⚠️ Requer domínio próprio.&lt;/li&gt;
&lt;li&gt;⚠️ Setup mais complexo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;O que é essa verificação bidirecional?&lt;/strong&gt; O sistema operacional só abre o app se ambas as pontas se reconhecerem: o app declara quais domínios ele trata, e o servidor confirma quais aplicativos têm permissão para isso — por meio de um arquivo hospedado no próprio domínio da aplicação (&lt;code&gt;assetlinks.json&lt;/code&gt; no Android, &lt;code&gt;apple-app-site-association&lt;/code&gt; no iOS). Se qualquer lado estiver faltando ou inconsistente, o link abre no navegador como fallback. Isso impede que um aplicativo malicioso reivindique seu domínio e intercepte seus links. Vamos montar esses arquivos em detalhes no Post 5.&lt;/p&gt;

&lt;p&gt;Na prática: use custom schemes durante o desenvolvimento e migre para HTTPS (App Links / Universal Links) em produção.&lt;/p&gt;




&lt;h2&gt;
  
  
  Nossa Aplicação: FitConnect
&lt;/h2&gt;

&lt;p&gt;Para tornar o aprendizado concreto, vamos construir o FitConnect — uma plataforma fictícia que conecta personal trainers com clientes por meio de um sistema de indicação.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O cenário:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Maria é personal trainer e quer indicar o app para seus alunos. Ela compartilha seu link de indicação. Quando um aluno se cadastra usando o link, Maria ganha bônus e o aluno ganha desconto.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O deep link principal da série:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://fitconnect.app/signup?referralCode=TRAINER12345678901234
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando um aluno clica nesse link, o app deve abrir diretamente na tela de cadastro com o código &lt;code&gt;TRAINER12345678901234&lt;/code&gt; já preenchido. Simples de descrever, mas com bastante detalhe de implementação por baixo.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Domínio&lt;/strong&gt;: &lt;code&gt;fitconnect.app&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom scheme&lt;/strong&gt;: &lt;code&gt;fitconnect://&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Package&lt;/strong&gt;: &lt;code&gt;com.fitconnect.app&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Preparando a Estrutura
&lt;/h2&gt;

&lt;p&gt;Antes de escrever qualquer código nativo, vale a pena definir as constantes, tipos e modelos que vão ser compartilhados entre todas as camadas do app.&lt;/p&gt;

&lt;h3&gt;
  
  
  Constantes
&lt;/h3&gt;

&lt;p&gt;Centralizar strings como os nomes dos channels evita erros de digitação difíceis de rastrear. Se o nome do channel no Dart não bater exatamente com o do Kotlin ou Swift, a comunicação falha silenciosamente.&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="c1"&gt;// lib/shared/const/deep_link_const.dart&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DeepLinkConst&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="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;methodChannel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'com.fitconnect.app/deeplink'&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="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;eventChannel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'com.fitconnect.app/deeplink_stream'&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="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;customScheme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'fitconnect'&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="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;httpsScheme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'https'&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="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;appHost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'fitconnect.app'&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="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;signupPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'/signup'&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="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;referralCodeParam&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'referralCode'&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="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;referralCodeLength&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Enum de Tipos
&lt;/h3&gt;

&lt;p&gt;O getter &lt;code&gt;isSecure&lt;/code&gt; torna o código mais expressivo — em vez de comparar strings ou verificar o scheme manualmente, você simplesmente checa &lt;code&gt;data.type.isSecure&lt;/code&gt;.&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="c1"&gt;// lib/shared/enums/deep_link_type.dart&lt;/span&gt;
&lt;span class="kt"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;DeepLinkType&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;customScheme&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;appLink&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;// Android HTTPS&lt;/span&gt;
  &lt;span class="n"&gt;universalLink&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// iOS HTTPS&lt;/span&gt;
  &lt;span class="n"&gt;unknown&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="n"&gt;isSecure&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;appLink&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;universalLink&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Modelo de Dados (Freezed)
&lt;/h3&gt;

&lt;p&gt;Se preferir, você não precisa utilizar o Freezed e pode criar seus modelos na mão. A grande vantagem de adotá-lo é a garantia de imutabilidade e a geração automática de código para comparação de objetos e o método copyWith. Como os deep links carregam parâmetros importantes (como o código de indicação), tratar esses dados de forma imutável nos protege de bugs difíceis de rastrear na navegação do app.&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="c1"&gt;// lib/shared/models/deep_link_data.dart&lt;/span&gt;
&lt;span class="nd"&gt;@freezed&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DeepLinkData&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;_$DeepLinkData&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="kd"&gt;factory&lt;/span&gt; &lt;span class="n"&gt;DeepLinkData&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="kd"&gt;required&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;url&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;DeepLinkType&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&gt;required&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;scheme&lt;/span&gt;&lt;span class="p"&gt;,&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;host&lt;/span&gt;&lt;span class="p"&gt;,&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;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nd"&gt;@Default&lt;/span&gt;&lt;span class="p"&gt;({})&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;queryParameters&lt;/span&gt;&lt;span class="p"&gt;,&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;referralCode&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;DateTime&lt;/span&gt; &lt;span class="n"&gt;receivedAt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;_DeepLinkData&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;
  
  
  O que construímos até aqui
&lt;/h2&gt;

&lt;p&gt;Ao final desta etapa, você já tem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clareza sobre como deep links funcionam.&lt;/li&gt;
&lt;li&gt;Entendimento das diferenças entre os tipos de links.&lt;/li&gt;
&lt;li&gt;Uma base sólida no Flutter para começar a implementação.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essa base será utilizada nos próximos passos para integrar o código nativo e completar o fluxo ponta a ponta.&lt;/p&gt;

&lt;p&gt;Na próxima etapa, vamos partir para a implementação nativa no Android — incluindo &lt;code&gt;AndroidManifest.xml&lt;/code&gt; e &lt;code&gt;MainActivity.kt&lt;/code&gt; completos.&lt;/p&gt;




&lt;p&gt;Código completo disponível no repositório: &lt;a href="https://github.com/crdornelles/fit_connect" rel="noopener noreferrer"&gt;FitConnect no GitHub&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Este é o primeiro post de uma série de 9 sobre deep links em Flutter. Nos próximos artigos, vamos do código nativo para o Android e iOS até deferred links, redirect pages e testes — tudo sem depender de pacotes prontos. Se você tem dúvidas, sugestões ou já passou por algum problema parecido com deep links, conta nos comentários! Adoro saber como essa experiência se aplica em projetos reais. E se quiser acompanhar os próximos posts, é só seguir aqui no Medium.&lt;/p&gt;




&lt;p&gt;Se esse conteúdo te ajudou, deixa um ❤️ ou um 🔖 aqui no DEV.to — isso ajuda o post a alcançar mais devs.&lt;/p&gt;

&lt;p&gt;E você, já implementou deep links no seu app?&lt;br&gt;&lt;br&gt;
Qual foi o maior desafio que encontrou?&lt;/p&gt;

&lt;p&gt;Quero usar esses casos reais nos próximos posts da série 👇&lt;/p&gt;




&lt;h1&gt;
  
  
  flutter #android #ios #deeplinks #mobile #programming
&lt;/h1&gt;

</description>
      <category>flutter</category>
      <category>android</category>
      <category>ios</category>
      <category>deeplinks</category>
    </item>
  </channel>
</rss>
