<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: akram chorfi</title>
    <description>The latest articles on DEV Community by akram chorfi (@akram_chorfi_998755988875).</description>
    <link>https://dev.to/akram_chorfi_998755988875</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3678548%2Fecd8d976-01a3-497c-bf7b-aa13eb19fc40.png</url>
      <title>DEV Community: akram chorfi</title>
      <link>https://dev.to/akram_chorfi_998755988875</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/akram_chorfi_998755988875"/>
    <language>en</language>
    <item>
      <title>Firebase Dynamic Links is being deprecated – here’s how I use LinkHive with Flutter</title>
      <dc:creator>akram chorfi</dc:creator>
      <pubDate>Thu, 25 Dec 2025 17:08:28 +0000</pubDate>
      <link>https://dev.to/akram_chorfi_998755988875/firebase-dynamic-links-is-being-deprecated-heres-how-i-use-linkhive-with-flutter-4jp9</link>
      <guid>https://dev.to/akram_chorfi_998755988875/firebase-dynamic-links-is-being-deprecated-heres-how-i-use-linkhive-with-flutter-4jp9</guid>
      <description>&lt;p&gt;I wanted deep links in my Flutter app – links that could take users straight to the right screen, even after they installed or reinstalled the app.&lt;/p&gt;

&lt;p&gt;That’s why I built &lt;strong&gt;LinkHive&lt;/strong&gt; – a Firebase Dynamic Links alternative with a Flutter SDK that lets you create, update, fetch, delete, and handle deferred links all in one place. It’s simple, predictable, and works across Web, iOS, and Android.&lt;/p&gt;

&lt;p&gt;In this post, I’ll show you how to get it running and start generating dynamic links in minutes.&lt;/p&gt;

&lt;p&gt;Before we dive into the SDK, let’s get your platforms set up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setting up LinkHive on all platforms&lt;/strong&gt; 🌐📱&lt;br&gt;
1️⃣ &lt;strong&gt;Web&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No setup needed!&lt;/p&gt;

&lt;p&gt;Go to your Admin Dashboard&lt;/p&gt;

&lt;p&gt;Create a Web platform entry&lt;/p&gt;

&lt;p&gt;Start generating dynamic links that work in all browsers immediately&lt;/p&gt;

&lt;p&gt;2️⃣ &lt;strong&gt;iOS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To make Universal Links work:&lt;/p&gt;

&lt;p&gt;Add your app’s Associated Domains entitlement with your LinkHive domain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;applinks:xxx.linkhive.tech
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or your branded custom domain.&lt;/p&gt;

&lt;p&gt;LinkHive automatically hosts and updates the apple-app-site-association file.&lt;/p&gt;

&lt;p&gt;In your Admin Dashboard:&lt;/p&gt;

&lt;p&gt;Add a new iOS platform&lt;/p&gt;

&lt;p&gt;Enter your Bundle ID and Team ID&lt;/p&gt;

&lt;p&gt;⚠️ Apple may take up to 24 hours to recognize the file.&lt;/p&gt;

&lt;p&gt;Once done, dynamic links open your app seamlessly on iOS.&lt;/p&gt;

&lt;p&gt;3️⃣ &lt;strong&gt;Android&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Update your AndroidManifest.xml&lt;/p&gt;

&lt;p&gt;Add this inside the activity that handles the links:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;intent-filter android:autoVerify="true"&amp;gt;
    &amp;lt;action android:name="android.intent.action.VIEW" /&amp;gt;
    &amp;lt;category android:name="android.intent.category.DEFAULT" /&amp;gt;
    &amp;lt;category android:name="android.intent.category.BROWSABLE" /&amp;gt;
    &amp;lt;data android:scheme="https"
          android:host="xxx.linkhive.tech" /&amp;gt;
&amp;lt;/intent-filter&amp;gt;

&amp;lt;meta-data android:name="flutter_deeplinking_enabled" android:value="false"/&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;LinkHive automatically hosts your assetlinks.json file for domain verification.&lt;/p&gt;

&lt;p&gt;In your Admin Dashboard:&lt;/p&gt;

&lt;p&gt;Add a new Android platform&lt;/p&gt;

&lt;p&gt;Enter your Package Name and SHA-256 Certificate Fingerprint&lt;/p&gt;

&lt;p&gt;✅ Domain verification is usually instant.&lt;/p&gt;

&lt;p&gt;Test it&lt;/p&gt;

&lt;p&gt;adb shell am start -a android.intent.action.VIEW -c android.intent.category.BROWSABLE -d "&lt;a href="https://subdomain.linkhive.tech/shortCode" rel="noopener noreferrer"&gt;https://subdomain.linkhive.tech/shortCode&lt;/a&gt;"&lt;/p&gt;

&lt;p&gt;If everything is configured, the link opens directly in your app.&lt;/p&gt;

&lt;p&gt;🚀 After setup&lt;/p&gt;

&lt;p&gt;Once your app is registered and the platform configs are done, LinkHive handles all routing and link resolution automatically.&lt;/p&gt;

&lt;p&gt;No extra dependencies are required, and the Flutter SDK gives you full control over dynamic link features.&lt;/p&gt;

&lt;p&gt;Using the Flutter SDK&lt;/p&gt;

&lt;p&gt;Once your platforms are ready, the SDK lets you create, fetch, update, delete, and handle deferred links in Flutter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Connect to the LinkHive API&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
import 'package:link_hive_flutter/link_hive_flutter.dart';

await LinkHiveClient.instance.connect(
  baseUrl: 'YOUR_BASE_URL_HERE',
  projectId: 'YOUR_PROJECT_ID_HERE',
  clientId: 'YOUR_CLIENT_ID_HERE',
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Create a Dynamic Link&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;final request = DynamicLinkRequest(
  platformIds: {
    '123e4567-e89b-12d3-a456-426614174000',
    '987e4567-e89b-12d3-a456-426614174001'
  },
  utm_medium: 'twitter',
);

final dynamicLink = await LinkHiveClient.instance.dynamicLinks.create(request);
print('Created dynamic link: $dynamicLink');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Update a Link&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;final updatedLink = await LinkHiveClient.instance.dynamicLinks.update(
  'linkId', 
  request,
);
print('Updated dynamic link: $updatedLink');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Fetch Links&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;final linkById = await LinkHiveClient.instance.dynamicLinks.getById('linkId');
print('Fetched by ID: $linkById');

final linkByShortCode = await LinkHiveClient.instance.dynamicLinks.getByShortCode('shortCode');
print('Fetched by short code: $linkByShortCode');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Delete a Link&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;await LinkHiveClient.instance.dynamicLinks.delete('linkId');
print('Dynamic link deleted.');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Deferred Links (After App Install)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;final deferredLink = await LinkHiveClient.instance.dynamicLinks.getDeferredLink();
if (deferredLink != null) {
  print('Deferred link: $deferredLink');
} else {
  print('No deferred link found');
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Handling Links While App is Running&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;final initialLink = await LinkHiveClient.instance.dynamicLinks.getInitialLink();
print(initialLink ?? 'No initial link');

LinkHiveClient.instance.dynamicLinks.onLinkReceived.listen((link) {
  print('Received dynamic link: $link');
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Errors&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The SDK throws:&lt;/p&gt;

&lt;p&gt;NotFoundException → resource not found&lt;/p&gt;

&lt;p&gt;ApiException → API error&lt;/p&gt;

&lt;p&gt;NetworkException → network issue&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wrap-up&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;LinkHive makes deep linking in Flutter way simpler than Firebase Dynamic Links.&lt;/p&gt;

&lt;p&gt;You get:&lt;/p&gt;

&lt;p&gt;Easy dynamic link creation, update, fetch, delete&lt;/p&gt;

&lt;p&gt;Deferred link support&lt;/p&gt;

&lt;p&gt;iOS &amp;amp; Android handling with minimal setup&lt;/p&gt;

&lt;p&gt;Fully working Flutter SDK&lt;/p&gt;

&lt;p&gt;Check it out:&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/LinkHiveTech/linkhive_flutter" rel="noopener noreferrer"&gt;https://github.com/LinkHiveTech/linkhive_flutter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Docs: &lt;a href="https://docs.linkhive.tech" rel="noopener noreferrer"&gt;https://docs.linkhive.tech&lt;/a&gt;&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>firebase</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
