{"id":1868,"date":"2026-05-30T05:38:09","date_gmt":"2026-05-30T05:38:09","guid":{"rendered":"https:\/\/documentation.iqonic.design\/streamit-laravel\/?p=1868"},"modified":"2026-09-10T09:32:06","modified_gmt":"2026-09-10T09:32:06","slug":"streamit-flutter-short-drama-add-on-install-guide","status":"publish","type":"post","link":"https:\/\/documentation.iqonic.design\/streamit-laravel\/streamit-flutter-short-drama-add-on-install-guide\/","title":{"rendered":"Streamit Laravel Flutter App &#8211; Short Drama Add-on Install Guide"},"content":{"rendered":"<div class=\"nolwrap\">\n<p>This add-on is installed in two steps only:<\/p>\n\n\n\n<p>1. Copy the <code>short_drama<\/code> folder into <code>lib\/<\/code>.<\/p>\n\n\n\n<p>2. Register the module in <code>lib\/addon_registration.dart<\/code>.<\/p>\n\n\n\n<ol class=\"wp-block-list\"><\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Prerequisites<\/h2>\n\n\n\n<p><a href=\"https:\/\/github.com\/iqonic-products\/streamit-laravel-short-drama-flutter-addon\/blob\/feature\/shortdrama-v2\/INSTALLATION_GUIDE.md#prerequisites\" target=\"_blank\" rel=\"noopener\"><\/a><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The Laravel backend must already have the Short Drama add-on plugin installed and configured correctly.<\/li>\n\n\n\n<li>The backend base URL must match the value of <code>DOMAIN_URL<\/code> in <a href=\"https:\/\/github.com\/iqonic-products\/streamit-laravel-short-drama-flutter-addon\/blob\/feature\/shortdrama-v2\/lib\/configs.dart\" target=\"_blank\" rel=\"noopener\">lib\/configs.dart<\/a>.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Install Steps<\/h2>\n\n\n\n<p><a href=\"https:\/\/github.com\/iqonic-products\/streamit-laravel-short-drama-flutter-addon\/blob\/feature\/shortdrama-v2\/INSTALLATION_GUIDE.md#install-steps\" target=\"_blank\" rel=\"noopener\"><\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1) Copy the add-on folder into <code>lib\/<\/code><\/h3>\n\n\n\n<p><a href=\"https:\/\/github.com\/iqonic-products\/streamit-laravel-short-drama-flutter-addon\/blob\/feature\/shortdrama-v2\/INSTALLATION_GUIDE.md#1-copy-the-add-on-folder-into-lib\" target=\"_blank\" rel=\"noopener\"><\/a><\/p>\n\n\n\n<p>Copy the add-on folder so the project contains:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>YOUR_FLUTTER_APP\/lib\/short_drama\/<\/code><\/li>\n<\/ul>\n\n\n\n<p>That folder already includes the Short Drama module files.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2) Register the add-on in one place<\/h3>\n\n\n\n<p><a href=\"https:\/\/github.com\/iqonic-products\/streamit-laravel-short-drama-flutter-addon\/blob\/feature\/shortdrama-v2\/INSTALLATION_GUIDE.md#2-register-the-add-on-in-one-place\" target=\"_blank\" rel=\"noopener\"><\/a><\/p>\n\n\n\n<p>Open <code>YOUR_FLUTTER_APP\/lib\/addon_registration.dart<\/code> and add the Short Drama registration call:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">import 'package:streamit_laravel\/addon_bridge\/short_drama\/short_drama_bridge.dart';\nimport 'package:streamit_laravel\/short_drama\/short_drama_delegate_impl.dart';\n\nclass ShortDramaAddon {\n  static void register() {\n    ShortDramaBridge.register(ShortDramaDelegateImpl());\n  }\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Deep Linking (optional)<\/h2>\n\n\n\n<p><a href=\"https:\/\/github.com\/iqonic-products\/streamit-laravel-short-drama-flutter-addon\/blob\/feature\/shortdrama-v2\/INSTALLATION_GUIDE.md#deep-linking-optional\" target=\"_blank\" rel=\"noopener\"><\/a><\/p>\n\n\n\n<p>Skip this section entirely if you do not need shared episode links to open in the app. Short Drama works without it; links simply open in the browser.<\/p>\n\n\n\n<p>Shared links look like <code>https:\/\/YOUR_DOMAIN\/short-drama\/sd2_&lt;token&gt;<\/code>. The token is encrypted, so the module decodes it and resolves the drama, episode and resume position before navigating.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Prerequisites<\/h3>\n\n\n\n<p><a href=\"https:\/\/github.com\/iqonic-products\/streamit-laravel-short-drama-flutter-addon\/blob\/feature\/shortdrama-v2\/INSTALLATION_GUIDE.md#prerequisites-1\" target=\"_blank\" rel=\"noopener\"><\/a><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>encrypt<\/code> and <code>crypto<\/code> must be in your <code>pubspec.yaml<\/code>. Both ship with the base app; confirm they are present before continuing.<\/li>\n\n\n\n<li>The host app must expose the deep-link methods on <code>ShortDramaBridge<\/code> (<code>handleDeepLink<\/code>, <code>resumePendingDeepLink<\/code>, <code>deepLinkHandledThisLaunch<\/code>). Older hosts predate them &#8211; update the bridge first or this section will not compile.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">1) Declare the intent filter (Android)<\/h3>\n\n\n\n<p><a href=\"https:\/\/github.com\/iqonic-products\/streamit-laravel-short-drama-flutter-addon\/blob\/feature\/shortdrama-v2\/INSTALLATION_GUIDE.md#1-declare-the-intent-filter-android\" target=\"_blank\" rel=\"noopener\"><\/a><\/p>\n\n\n\n<p>In <code>YOUR_FLUTTER_APP\/android\/app\/src\/main\/AndroidManifest.xml<\/code>, inside the <code>MainActivity<\/code> activity, add your domain:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&lt;intent-filter android:autoVerify=\"true\"&gt;\n    &lt;action android:name=\"android.intent.action.VIEW\" \/&gt;\n    &lt;category android:name=\"android.intent.category.DEFAULT\" \/&gt;\n    &lt;category android:name=\"android.intent.category.BROWSABLE\" \/&gt;\n    &lt;data android:scheme=\"https\" \/&gt;\n    &lt;data android:scheme=\"http\" \/&gt;\n    &lt;data android:host=\"YOUR_DOMAIN\" \/&gt;\n    &lt;data android:pathPrefix=\"\/short-drama\" \/&gt;\n&lt;\/intent-filter&gt;<\/pre>\n\n\n\n<p>Replace <code>YOUR_DOMAIN<\/code> with the host in <code>DOMAIN_URL<\/code>. <code>autoVerify<\/code> requires a matching <code>assetlinks.json<\/code> served from <code>https:\/\/YOUR_DOMAIN\/.well-known\/<\/code>, otherwise Android shows the app chooser instead of opening the app directly.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2) Route incoming links (<code>lib\/screens\/splash_controller.dart<\/code>)<\/h3>\n\n\n\n<p><a href=\"https:\/\/github.com\/iqonic-products\/streamit-laravel-short-drama-flutter-addon\/blob\/feature\/shortdrama-v2\/INSTALLATION_GUIDE.md#2-route-incoming-links-libscreenssplash_controllerdart\" target=\"_blank\" rel=\"noopener\"><\/a><\/p>\n\n\n\n<p>Deep links reach the app while the splash screen is running. Two edits:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">import 'package:streamit_laravel\/addon_bridge\/short_drama\/short_drama_bridge.dart';\n\nvoid handleDeepLinking({required String deepLink}) {\n  if (deepLink.contains('short-drama')) {\n    ShortDramaBridge.handleDeepLink(deepLink);\n    return;\n  }\n  \/\/ ...your existing content-details routing...\n}<\/pre>\n\n\n\n<p>Then guard the splash redirect timer, so it does not navigate over a link that has already been handled:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">if (ShortDramaBridge.deepLinkHandledThisLaunch) return;<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3) Resume after profile selection (<code>lib\/screens\/profile\/watching_profile\/watching_profile_screen.dart<\/code>)<\/h3>\n\n\n\n<p><a href=\"https:\/\/github.com\/iqonic-products\/streamit-laravel-short-drama-flutter-addon\/blob\/feature\/shortdrama-v2\/INSTALLATION_GUIDE.md#3-resume-after-profile-selection-libscreensprofilewatching_profilewatching_profile_screendart\" target=\"_blank\" rel=\"noopener\"><\/a><\/p>\n\n\n\n<p>A link can arrive before a watching profile is chosen. On profile select, resume it instead of going to the dashboard:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">ShortDramaBridge.resumePendingDeepLink().then((resumed) {\n  if (!resumed) {\n    Get.offAll(() =&gt; DashboardScreen());\n  }\n});<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Why these call the bridge<\/h3>\n\n\n\n<p><a href=\"https:\/\/github.com\/iqonic-products\/streamit-laravel-short-drama-flutter-addon\/blob\/feature\/shortdrama-v2\/INSTALLATION_GUIDE.md#why-these-call-the-bridge\" target=\"_blank\" rel=\"noopener\"><\/a><\/p>\n\n\n\n<p>Every call above goes through <code>ShortDramaBridge<\/code>, never through <code>short_drama\/<\/code> directly. When the add-on is not registered the bridge returns <code>false<\/code> and the host falls through to its normal routing, so the app still compiles and runs without the add-on installed. Importing <code>short_drama\/service\/short_drama_deep_link_service.dart<\/code> from host files breaks that guarantee &#8211; do not do it.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Verify<\/h3>\n\n\n\n<p><a href=\"https:\/\/github.com\/iqonic-products\/streamit-laravel-short-drama-flutter-addon\/blob\/feature\/shortdrama-v2\/INSTALLATION_GUIDE.md#verify\" target=\"_blank\" rel=\"noopener\"><\/a><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">adb shell am start -a android.intent.action.VIEW   -d \"https:\/\/YOUR_DOMAIN\/short-drama\/sd2_&lt;token&gt;\"<\/pre>\n\n\n\n<p>The app should open the episode at its saved position. If it opens on the dashboard instead, the link was not claimed &#8211; check the intent filter host and that <code>ShortDramaAddon.register()<\/code> runs before the link is processed.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Limitations<\/h3>\n\n\n\n<p><a href=\"https:\/\/github.com\/iqonic-products\/streamit-laravel-short-drama-flutter-addon\/blob\/feature\/shortdrama-v2\/INSTALLATION_GUIDE.md#limitations\" target=\"_blank\" rel=\"noopener\"><\/a><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Android only.<\/strong> iOS Universal Links need an <code>associated-domains<\/code> entitlement and an <code>apple-app-site-association<\/code> file, neither of which ships with the base app. On iOS these links open in Safari.<\/li>\n\n\n\n<li>A link is handled once per launch, tracked by <code>deepLinkHandledThisLaunch<\/code>.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Notes<\/h2>\n\n\n\n<p><a href=\"https:\/\/github.com\/iqonic-products\/streamit-laravel-short-drama-flutter-addon\/blob\/feature\/shortdrama-v2\/INSTALLATION_GUIDE.md#notes\" target=\"_blank\" rel=\"noopener\"><\/a><\/p>\n\n\n\n<p>If the backend base URL in <a href=\"https:\/\/github.com\/iqonic-products\/streamit-laravel-short-drama-flutter-addon\/blob\/feature\/shortdrama-v2\/lib\/configs.dart\" target=\"_blank\" rel=\"noopener\">lib\/configs.dart<\/a> does not match the Laravel environment, Short Drama will not load correctly.<\/p>\n\n\n\n<p>In this codebase the file is named <code>lib\/addon_registration.dart<\/code>.<\/p>\n\n\n\n<p><code>lib\/main.dart<\/code> already calls <code>ShortDramaAddon.register()<\/code> during startup.<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>This add-on is installed in two steps only: 1. Copy the short_drama folder into lib\/. 2. Register the module in lib\/addon_registration.dart. Prerequisites Install Steps 1) Copy the add-on folder into lib\/ Copy the add-on folder so the project contains: That folder already includes the Short Drama module files. 2) Register the add-on in one place [&hellip;]<\/p>\n","protected":false},"author":11,"featured_media":0,"parent":1880,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1868","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"featured_image_src":null,"author_info":{"display_name":"laraveladminiq","author_link":"https:\/\/documentation.iqonic.design\/streamit-laravel\/author\/laraveladminiq\/"},"children":[],"_links":{"self":[{"href":"https:\/\/documentation.iqonic.design\/streamit-laravel\/wp-json\/wp\/v2\/posts\/1868","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/documentation.iqonic.design\/streamit-laravel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/documentation.iqonic.design\/streamit-laravel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/documentation.iqonic.design\/streamit-laravel\/wp-json\/wp\/v2\/users\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/documentation.iqonic.design\/streamit-laravel\/wp-json\/wp\/v2\/comments?post=1868"}],"version-history":[{"count":8,"href":"https:\/\/documentation.iqonic.design\/streamit-laravel\/wp-json\/wp\/v2\/posts\/1868\/revisions"}],"predecessor-version":[{"id":1979,"href":"https:\/\/documentation.iqonic.design\/streamit-laravel\/wp-json\/wp\/v2\/posts\/1868\/revisions\/1979"}],"up":[{"embeddable":true,"href":"https:\/\/documentation.iqonic.design\/streamit-laravel\/wp-json\/wp\/v2\/posts\/1880"}],"wp:attachment":[{"href":"https:\/\/documentation.iqonic.design\/streamit-laravel\/wp-json\/wp\/v2\/media?parent=1868"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/documentation.iqonic.design\/streamit-laravel\/wp-json\/wp\/v2\/categories?post=1868"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/documentation.iqonic.design\/streamit-laravel\/wp-json\/wp\/v2\/tags?post=1868"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}