Skip to main content
The deep links module handles deferred deep links — routing users to the correct screen on first launch after installing from a link.
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

MethodSignatureDescription
checkDeferredFuture<DeepLink?> checkDeferred()Check for a deferred deep link
handleIncomingvoid handleIncoming(Uri uri)Pass an incoming deep link to the SDK
set delegateset delegate(DeepLinkDelegate?)Set a delegate for deep link callbacks
PropertyTypeDescription
screenStringTarget screen path
paramsMap<String, String>Additional parameters
sourceString?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();

Platform Setup

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

EventTrigger
deep_link_receivedA deep link is opened
deferred_deep_link_resolvedA 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.