Checkpoint da Série: o que já funciona, o que quebrou e para onde vamos (Parte 4.5)
Quatro posts publicados. Antes de seguir para produção, um mapa do que foi construído — e o bug silencioso que encontramos testando no dispositivo real.
O que foi implementado
Post 1 — Fundação
Tipos de deep link, diferenças entre custom scheme, App Links e Universal Links, estrutura base em Dart. Sem pacote externo.
Medium: https://medium.com/@crdornelles/deep-links-em-flutter-o-guia-definitivo-para-iniciantes-parte-1-d56ea3619192
dev.to: https://dev.to/cdornelles/deep-links-em-flutter-o-guia-definitivo-para-iniciantes-sem-pacotes-de-terceiros-parte-1-4a31
Post 2 — Android nativo
AndroidManifest.xml com intent-filter, MainActivity.kt registrando MethodChannel (cold start) e EventChannel (app aberto).
Medium: https://medium.com/p/562bb353b3b2?postPublishedType=initial
dev.to: https://dev.to/cdornelles/deep-links-no-android-implementacao-nativa-com-kotlin-flutter-parte-2-311n
Post 3 — iOS nativo
Info.plist + Runner.entitlements + AppDelegate.swift espelhando a mesma lógica do Android.
Medium: https://medium.com/@crdornelles/deep-links-no-ios-implementa%C3%A7%C3%A3o-nativa-com-swift-flutter-parte-3-d37569fd0a15
dev.to: https://dev.to/cdornelles/deep-links-no-ios-implementacao-nativa-com-swift-flutter-parte-3-1521
Post 4 — Integração Flutter
DeepLinkService com MethodChannel + EventChannel, StreamController.broadcast(), SignupPage com referral code pré-preenchido.
Medium: https://medium.com/@crdornelles/conectando-tudo-integra%C3%A7%C3%A3o-flutter-com-deep-links-nativos-parte-4-b9b23c6e32e5
dev.to: https://dev.to/cdornelles/conectando-tudo-integracao-flutter-com-deep-links-nativos-parte-4-5blb
O bug silencioso do Post 4
Durante os testes, o app abria mas o referral code nunca aparecia. Sem erro, sem exception, sem log.
Causa: race condition com StreamController.broadcast().
O problema na prática
// ❌ errado
await service.initialize(); // evento emitido aqui...
_deepLinkSub = service.deepLinkStream.listen(...); // listener registrado depois
// ✅ correto
_deepLinkSub = service.deepLinkStream.listen(...); // listener ativo antes de qualquer evento
await service.initialize();
broadcast() não bufferiza. Evento sem listener ativo = evento perdido. A ordem importa.
Esse é o tipo de bug que não aparece em log, não quebra o app, e passa despercebido até produção.
Onde estamos agora
O fluxo ponta a ponta já funciona:
- Android → captura o intent corretamente
- iOS → captura a URL corretamente
- Flutter → recebe via
MethodChannel/EventChannele processa - UI → reage ao deep link com o referral code pré-preenchido

Mas ainda falta o mais difícil: fazer isso funcionar fora do ambiente de desenvolvimento.
O que vem a seguir
- Post 5: App Links e Universal Links em produção — verificação de domínio,
assetlinks.json,apple-app-site-association - Post 6: Deferred Deep Links — quando o usuário não tem o app instalado
- Post 7: Página HTML de redirect inteligente
- Post 8: Testes e troubleshooting
- Post 9: Refatoração com Clean Architecture
Código completo: https://github.com/crdornelles/fit_connect — branch post/04-flutter
Checkpoint completo no Medium: https://medium.com/p/0eb2933b5198?postPublishedType=initial