From a8b61f02cf30f8ad910749158c88c03e83d3ace9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cnb9960=E2=80=9D?= <“nbodani8@gmail.com”> Date: Mon, 8 Mar 2021 23:40:39 +0530 Subject: [PATCH] feat: dynamic link --- android/app/build.gradle | 1 + android/app/src/main/AndroidManifest.xml | 10 +++++ lib/main.dart | 2 +- lib/services/dynamicLink.dart | 36 +++++++++++++++ lib/widgets/product/product_page.dart | 15 ++++++- lib/widgets/splash.dart | 56 ++++++++++++++++++++++++ pubspec.yaml | 3 ++ 7 files changed, 121 insertions(+), 2 deletions(-) create mode 100644 lib/services/dynamicLink.dart diff --git a/android/app/build.gradle b/android/app/build.gradle index 5fc80e7..aeca324 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -60,4 +60,5 @@ flutter { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation 'com.google.firebase:firebase-dynamic-links' } diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index d098a2f..cf39cd2 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -37,6 +37,16 @@ + + + + + + + + diff --git a/lib/main.dart b/lib/main.dart index a0788f4..218e21b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -22,7 +22,7 @@ class MyApp extends StatelessWidget { routes: { '/dashboard': (BuildContext context) => Dashboard(), }, - home: Splash(), + home: Splash(initLink: true), ); } } diff --git a/lib/services/dynamicLink.dart b/lib/services/dynamicLink.dart new file mode 100644 index 0000000..6864eb1 --- /dev/null +++ b/lib/services/dynamicLink.dart @@ -0,0 +1,36 @@ +import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; +import 'package:flutter/material.dart'; + +class DynamicLinkService { + static Future createDynamicLink( + {int height, + String text, + String owner, + String image, + String seller, + String amount, + bool isProduct = false}) async { + final DynamicLinkParameters parameters = DynamicLinkParameters( + uriPrefix: 'https://relicbazaar.page.link', + // text: text, + // owner: owner, + // image: image, + // prodHeight: height, + // seller: seller, + // amount: amount, + link: isProduct + ? Uri.parse( + 'https://relicbazaar.page.link.com/?isProduct=$isProduct&text=$text&height=$height&image=$image&seller=$seller&amount=$amount&owner=$owner') + : Uri.parse( + 'https://relicbazaar.page.link.com/?isProduct=$isProduct'), + androidParameters: AndroidParameters( + packageName: 'com.example.retro_shopping', + ), + ); + Uri url; + final ShortDynamicLink shortLink = await parameters.buildShortLink(); + url = shortLink.shortUrl; + + return url; + } +} diff --git a/lib/widgets/product/product_page.dart b/lib/widgets/product/product_page.dart index d8c24b0..9a05b3b 100644 --- a/lib/widgets/product/product_page.dart +++ b/lib/widgets/product/product_page.dart @@ -345,7 +345,20 @@ class _ProductPageState extends State { width: width * 0.12, height: height * 0.05, borderColor: Colors.white, - ) + ), + RetroButton( + child: Center( + child: Icon( + Icons.share, + color: RelicColors.primaryColor, + ), + ), + upperColor: Colors.white, + lowerColor: Colors.black, + width: width * 0.12, + height: height * 0.05, + borderColor: Colors.white, + ), ], ), ), diff --git a/lib/widgets/splash.dart b/lib/widgets/splash.dart index 6fb3dd3..6ab6b29 100644 --- a/lib/widgets/splash.dart +++ b/lib/widgets/splash.dart @@ -1,7 +1,12 @@ import 'dart:async'; import 'package:flutter/material.dart'; +import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; +import 'package:retro_shopping/helpers/slide_route.dart'; +import 'package:retro_shopping/widgets/product/product_page.dart'; class Splash extends StatefulWidget { + final bool initLink; + Splash({this.initLink}); @override _SplashState createState() => _SplashState(); } @@ -11,6 +16,57 @@ class _SplashState extends State { void initState() { super.initState(); startTime(); + _initLink(); + } + + @override + void dispose() { + super.dispose(); + } + + Future initDynamicLinks() async { + final PendingDynamicLinkData data = + await FirebaseDynamicLinks.instance.getInitialLink(); + + await _handleDeepLink(data); + + // Register a link callback to fire if the app is opened up from the background + // using a dynamic link. + FirebaseDynamicLinks.instance.onLink( + onSuccess: (PendingDynamicLinkData dynamicLink) async { + // handle link that has been retrieved + await _handleDeepLink(dynamicLink); + }, onError: (OnLinkErrorException e) async { + print('Link Failed: ${e.message}'); + }); + } + + Future _handleDeepLink(PendingDynamicLinkData data) async { + final Uri deepLink = data?.link; + if (deepLink != null) { + if (deepLink.queryParameters['isProduct'] == 'true') { + Navigator.push( + context, + SlideBottomRoute( + page: ProductPage( + text: deepLink.queryParameters['text'], + owner: deepLink.queryParameters['owner'], + image: deepLink.queryParameters['image'], + prodHeight: int.tryParse(deepLink.queryParameters['height']), + seller: deepLink.queryParameters['seller'], + amount: deepLink.queryParameters['amount'], + ))); + } + } + } + + _initLink() { + Future.delayed( + Duration(milliseconds: 300), + () async { + if (widget.initLink) await initDynamicLinks(); + }, + ); } startTime() async { diff --git a/pubspec.yaml b/pubspec.yaml index ae956b9..a6bfdf4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -31,6 +31,9 @@ dependencies: google_fonts: ^1.1.0 razorpay_flutter: 1.1.0 fluttertoast: ^7.1.8 + firebase_dynamic_links: ^0.6.3 + esys_flutter_share: ^1.0.2 + dependency_overrides: flutter_svg: 0.19.0 dev_dependencies: