
Not everyone will wait for detours. When people tap on a link, they want to take that immediate, contextual jump, whether to a product, a promotion, or a help page. If your app is incapable of delivering that instant jump, then most likely, you’ve already lost them.
It is here that deep linking in Flutter apps shines, not as a nicety, but as a core component of mobile experience design. It connects external touchpoints with deeply meaningful in-app destinations, so every tap matters. Whether through campaigns, email flows, Flutter push notification deep linking, web-to-app experiences, or re-engagement strategies, Flutter app deep linking eliminates frustrating dead ends and ambiguity.
Here, you will learn how to bring deep linking in Flutter into your app, shining a spotlight on iOS Universal Links and Android deep linking tutorial examples. You’ll see how to build seamless, intent-driven experiences that are intuitive to the user and a massive advantage to your business. No generic landings. No conversions lost. Just smooth, intelligent navigation from the outside world right into the center of your app, powered by cross-platform deep linking in Flutter.
If you’re planning to implement these features, you can hire flutter developers with expertise in deep linking, Firebase Dynamic Links, and routing strategies.
What is Deep Linking and Universal Links?
If you’re creating a product focused on user retention and engagement, you need to understand the concept of deep linking Flutter techniques. This approach converts a standard app launch into a specific experience using URLs that bring users directly to specific screens or features. It enhances both usability and performance.
Its impact is particularly strong in apps with large user bases, diverse content, or complex workflows. With Flutter universal links or Flutter custom URL schemes, your users can jump directly to a section of your app without navigating manually. Universal Links for iOS and App Links for Android are advanced deep links that operate even when the app isn’t installed. In those cases, they redirect to a web browser, offering users the option to install the app.

Why Use Deep Linking in Flutter?
For companies building apps with Flutter, Flutter app linking solutions are essential. Whether you’re redirecting users from a campaign, handling Flutter route deep linking, or streamlining navigation within the app, deep linking Flutter simplifies access and drives better results.
This is why it’s so important: dynamic deep links in Flutter remove extra navigation steps, improving the user experience and leading them directly to the content that matters. From personalized campaigns to Flutter Firebase dynamic links in notifications, each deep link delivers targeted value.
For marketers, this strategy provides direct paths to promotions or specific campaign pages, boosting conversions. And for re-engagement, deferred deep linking Flutter ensures users return to the right spot, maintaining continuity and maximizing retention.
The data speaks volumes: deep linking iOS and Android is not just a UX improvement, it’s a business driver.

When implemented correctly, flutter app development integrated with deep links transforms casual interactions into high-intent actions, powering better retention, deeper engagement, and measurable growth.
Guide to Implement Flutter Deep Linking with Universal Links
Flutter deep linking enables smarter app navigation and user engagement.

For a step-by-step breakdown by the Flutter team, refer to the official Flutter deep linking guide.
Step 1: Flutter App Setup
Create a Flutter app:
flutter create deeplink_project
Deep linking in Flutter apps is a powerful feature that allows your app to be launched and navigated to a specific screen via a URL. The app_links package simplifies handling mobile deep linking for both Android (App Links) and iOS (Universal Links), as well as Flutter custom URL scheme configurations.
Step 2: Installation
Add the app_links and go_router dependency to your pubspec.yaml:
dependencies:
app_links: ^6.4.0
go_router: ^15.2.3
Code language: CSS (css)
Then run:
Bash
flutter pub get
Code language: JavaScript (javascript)
This step sets up the essential tools required for building and handling deep linking in Flutter with scalable navigation architecture.
Step 3: Android Configuration
AndroidManifest.xml
For Android App Links (using http or https), add an intent filter in android/app/src/main/AndroidManifest.xml:
You should add the <intent-filter>
inside the <activity>
tag for your AndroidManifest, which is usually found in:
android/app/src/main/AndroidManifest.xml
How to Add the Intent Filter
1. Open android/app/src/main/AndroidManifest.xml
in your code editor.
2. Locate the <activity>
tag for your main activity. In a Flutter project, it usually looks like this:
<activity
android:name=".MainActivity"
...>
<!-- Add your intent-filter here -->
</activity>
Code language: HTML, XML (xml)
3. Paste your <intent-filter>
inside the <activity>
tag.
Here’s how it might look in context, supporting both deep linking iOS and Android features:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<application
...>
<activity
android:name=".MainActivity"
android:exported="true"
...>
<!-- App Links and Custom Scheme Intent Filter -->
<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" />
<!-- For Custom Scheme -->
<data android:scheme="myapp" android:host="product" />
<!-- For Google Digital Asset Links Scheme -->
<data
android:scheme="https"
android:host="www.example.com"
android:pathPrefix="/" />
</intent-filter>
</activity>
</application>
</manifest>
Code language: HTML, XML (xml)
This step ensures your app handles universal links for mobile apps, including Flutter universal links support on Android.
Digital Asset Links File
You can generate a digital asset link file from here: https://developers.google.com/digital-asset-links/tools/generator
Please refer to this Screenshot for generating the file

Sample assetlinks.json file
[{
"relation": ["delegate_permission/common.handle_all_urls"],
"target" : { "namespace": "android_app", "package_name": "com.example.deeplink_project",
"sha256_cert_fingerprints": ["A4:4C:SB:BA:B9:87:6A:59:FC:F3:DF:27:44:E6:17:8B:F9:7B:37:97:89:65:D0:44:81:4D:4D:C3:69:72:FC:Q2"] }
}]
Code language: JSON / JSON with Comments (json)
Once your file is generated for Android App Links, you must host the assetlinks.json file on your domain at: https://your_domain_name/.well-known/assetlinks.json.
Notes: If you are using a Flutter custom URL scheme (such as myapp://), then you can avoid the digital asset links process for Android.
Step 4: iOS Configuration Info.plist
For Universal Links, configure your iOS/Runner/Info.plist:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>com.example.deeplink</string>
<key>CFBundleURLSchemes</key>
<array>
<string>myapp</string>
</array>
</dict>
</array>
Code language: HTML, XML (xml)
See the official iOS Universal Links setup documentation for detailed configuration steps
For Flutter deep linking tutorial using Universal Links, make sure your domain is associated with your app via the apple-app-site-association file hosted at: https://your_domain_name/.well-known/apple-app-site-association.
Sample apple-app-site-association file

Notes: If you are using a custom URL scheme (such as myapp://), then you can avoid the apple-app-site-association process for iOS. This is especially useful in cross-platform deep linking Flutter setups.
Step 5: Basic Deep Link Handling Example
Below is a minimal example showing how to listen for incoming Flutter app deep linking in your app:
main.dart
import 'package:flutter/material.dart';
import 'package:app_links/app_links.dart';
void main() {
runApp(DeepLinkApp());
}
class DeepLinkApp extends StatefulWidget {
@override
_DeepLinkAppState createState() => _DeepLinkAppState();
}
class _DeepLinkAppState extends State<DeepLinkApp> {
final appLinks = AppLinks(); //Creates an instance of AppLinksto listen for deep link events.
String? _currentPath; //stores the path portion of the received deep link URL.
@override
void initState() {
super.initState();
initDeepLinks(); //Calls initDeepLinks during widget initialization to set up listeners.
}
Future<void> initDeepLinks() async {
// Listen for incoming deep links
appLinks.uriLinkStream.listen((Uri? uri) {
if (uri != null) {
setState(() {
_currentPath = uri.path;
_handleDeepLink(_currentPath);
});
}
});
// Get the initial deep link (if any)
final initialUri = await appLinks.getInitialLink();
if (initialUri != null) {
setState(() {
_currentPath = initialUri.path;
_handleDeepLink(_currentPath);
});
}
}
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: Text('Deep Link Example')),
body: Center(
child: Text(_currentPath ?? 'No deep link received'),
),
),
);
}
}
Code language: JavaScript (javascript)
This code listens for Flutter URL scheme-based incoming deep links and displays the path in your app.
Step 6: Handling Navigation
The main goal of _handleDeepLink
is to interpret the path from a deep link and route the user to the appropriate screen. This enhances the user experience by allowing users to jump straight to relevant content, whether the app is already open or launched from a link.
Define _handleDeepLink
inside your Stateful Widget’s State Class. Since deep link navigation in Flutter often requires access to the BuildContext (for navigation), the _handleDeepLink
function should be defined inside the State class of your main app widget (not as a global function). Write this function above the Future<void> initDeepLinks()
method in your class.
dart
void _handleDeepLink(String? path) {
if (path == '/details') {
// Navigate to details screen
} else if (path == '/profile') {
// Navigate to profile screen
}
}
Code language: JavaScript (javascript)
Update your listener to call _handleDeepLink
with the path.
Effective navigation logic often works best when combined with proper Flutter state management to control screen behavior and maintain app state.
Step 7: Flutter Deep Linking Testing on Android and iOS
Android:
Use the ADB command:
For Google Digital Scheme:-bash command is ->
adb shell am start -W -a android.intent.action.VIEW -d "https://www.example.com/details" com.example.deeplink
Code language: JavaScript (javascript)
For Custom Scheme :- bash command is ->
adb shell am start -W -a android.intent.action.VIEW -d "myapp://product/details" com.example.deeplink
Code language: JavaScript (javascript)
iOS:
- Open Safari and navigate to
https://www.example.com/app/details
(for Universal Links). - Open Terminal on Mac and run this command:
xcrun simctl openurl booted "myapp://product/detail"
Or directly hit the URL in the browser for Flutter custom URL scheme testing.
This is how the deep link works sample video is attached.
For a more comprehensive validation of your integration, explore Flutter testing strategies including unit, widget, and integration tests.
Summary
Flutter deep linking enables apps to open and navigate to particular screens or content from URLs. This enhances the efficiency of the user experience by offering smooth, focused transitions from outside sources such as websites, notifications, or campaigns that minimize friction and maximize engagement.
Enabling deep linking in Flutter apps involves configuration and platform-specific setup. For Android, it involves configuring intent filters and placing metadata in the app manifest. For iOS, it depends on URL schemes and domain associations specified in the app configuration files. These configurations allow the app to identify and respond to incoming links like flutter firebase dynamic links.
Verification files need to be placed on your domain in order to establish a secure connection between your app and your site. These files ensure links are processed securely and properly on both platforms.
Flutter packages like app_links simplify this by detecting incoming URLs and allowing simple navigation within the app. They support both standard web URLs and Flutter custom URL scheme-based links and offer flexibility in many use cases, including deferred deep linking Flutter.
Both iOS and Android platforms need to be tested to ensure that links are acting as expected. This ensures that users experience consistency regardless of platform or entry point. You can ensure long-term reliability through mobile app support services that maintain and monitor your deep link setups.
When used properly, deep linking in Flutter apps is an impactful tactic that encourages engagement, guides user flows to the right spots, and provides instant access to valuable app functionality from any outside touchpoint.
In short, deep linking with app links in Flutter provides a cross-platform deep linking Flutter solution for app interaction, direct content sharing, and effortless navigation to destinations within an app.

The following table presents a compact overview of the platform-specific settings used for deep linking in Flutter. While Android and iOS settings are slightly different from each other, the result is the same: an intent-based navigation flow that happens with seamless ease of mind. These settings should be accurate, especially in production, because such configurations form trust between your app and its domain so that links are handled safely and reliably.
But the true strength of deep linking is far greater than simple ease of implementation. Teams need to consider how it will integrate into their wider app strategy, how that’s going to be around acquiring new users, re-engagement campaigns, or serving up content relevant to a particular user. Implemented properly, Flutter app deep linking best practices turn routing from a technical step into a driver of growth, retention, and seamless user experience. Combined with features like Flutter real-time communication, you can create a more interactive and connected user journey inside your app.

Author's Bio

Mayank Purohit brings over 5.6 years of experience in mobile application development, specializing in high-performance, user-centric apps for Android and iOS. Proficient in Kotlin, Swift, Flutter, and React Native, he delivers scalable and intuitive mobile solutions. He has contributed across all phases of the app lifecycle, from design to deployment. Known for clean, maintainable code and strong UI/UX practices, he combines technical skill with a user-first approach. His industry experience spans e-commerce, healthcare, finance, and social networking..