Conectando Deep Links ao Flutter: MethodChannel, EventChannel e DeepLinkService — sem pacote (Parte 4)
Continuando a série. Posts 2 e 3 cobriram o código nativo (Android e iOS).
Agora o Flutter precisa receber esses links.
Sem uni_links. Sem go_router. Só bridge nativo.
O problema clássico: Android captura o link, iOS captura o link — o Flutter não reage.
Causa: ninguém configurou os canais de comunicação.
No Post 4 implementei o DeepLinkService:
MethodChannel→ busca o link inicial (cold start)EventChannel→ stream para links com app abertoStreamController.broadcast()→ aceita múltiplos listeners sem explodir
Future<void> initialize() async {
if (_initialized) return;
_initialized = true;
final String? initialUrl =
await _methodChannel.invokeMethod('getInitialLink');
if (initialUrl != null) {
final data = _parseDeepLink(initialUrl);
if (data != null) _controller.add(data);
}
_eventChannel.receiveBroadcastStream().listen((url) {
if (url is String) {
final data = _parseDeepLink(url);
if (data != null) _controller.add(data);
}
});
}
Por que broadcast()?
Um StreamController padrão só aceita um listener. Se a tela de signup e o widget raiz estiverem ouvindo ao mesmo tempo, quebra. O .broadcast() resolve.
Fonte (post completo no Medium)
Como você lida com o timing entre o link chegar e a tela estar pronta?
Esse é o ponto que mais complica quando deep link é cold start.