The deep links module handles deferred deep links — routing users to the correct screen on first launch after installing from a link.
Deferred Deep Links
final deepLink = await AppDNA.deepLinks.checkDeferred();
if (deepLink != null) {
// deepLink.screen = "/workout/123"
// deepLink.params = {"ref": "instagram"}
navigate(deepLink.screen, deepLink.params);
}
checkDeferred should be called once on first launch, typically after configure() completes. Returns null if no deferred link is found.
Module Access
final deepLinks = AppDNA.deepLinks;
Module Methods
| Method | Signature | Description |
|---|
checkDeferred | Future<DeepLink?> checkDeferred() | Check for a deferred deep link |
handleIncoming | void handleIncoming(Uri uri) | Pass an incoming deep link to the SDK |
set delegate | set delegate(DeepLinkDelegate?) | Set a delegate for deep link callbacks |
DeepLink
| Property | Type | Description |
|---|
screen | String | Target screen path |
params | Map<String, String> | Additional parameters |
source | String? | Attribution source |
DeepLinkDelegate
class LinkHandler extends DeepLinkDelegate {
@override
void onLinkReceived(String url, Map<String, String> params) {
route(url, params);
}
@override
void onDeferredLinkResolved(DeepLink deepLink) {
route(deepLink.screen, deepLink.params);
}
}
AppDNA.deepLinks.delegate = LinkHandler();
Deep links require platform-specific configuration:
iOS: Enable Associated Domains and add applinks:yourapp.com in Xcode.
Android: Add intent filters to your AndroidManifest.xml:
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https" android:host="yourapp.com" />
</intent-filter>
Auto-Tracked Events
| Event | Trigger |
|---|
deep_link_received | A deep link is opened |
deferred_deep_link_resolved | A deferred deep link is resolved on first launch |
Full Example
import 'package:appdna_sdk/appdna_sdk.dart';
class AppCoordinator extends DeepLinkDelegate {
AppCoordinator() {
AppDNA.deepLinks.delegate = this;
}
Future<void> handleFirstLaunch() async {
final deepLink = await AppDNA.deepLinks.checkDeferred();
if (deepLink != null) {
route(deepLink.screen, deepLink.params);
if (deepLink.source != null) {
await AppDNA.identify(currentUserId, traits: {
"install_source": deepLink.source!,
});
}
} else {
showOnboarding();
}
}
@override
void onLinkReceived(String url, Map<String, String> params) {
route(url, params);
}
@override
void onDeferredLinkResolved(DeepLink deepLink) {
route(deepLink.screen, deepLink.params);
}
void route(String screen, Map<String, String> params) {
// Route to the correct screen
}
}
Deep link routes are configured in the Console under Engagement > Deep Links.