18

Can you please tell me how to Send and fetch the arguments using the flutter plugin firebase_dynamic_links[https://pub.dev/packages/firebase_dynamic_links#-readme-tab-]?

I want to pass parameters like username and password in the deeplink/dynamic link as follow :

uriPrefix: 'https://test.page.link/appinvite?username=Test&password=123456',
link: Uri.parse('https://test.page.link/appinvite?username=Test&password=123456'),

Is this the correct way to pass the data ?

After that i am using below code to fetch data,

await FirebaseDynamicLinks.instance.getInitialLink();
final Uri deepLink = data?.link;

But, it is providing me the dummy web URL i have added in the firebase console for firebase dynamic links in Deep Link URL

currently i am able to open the app from firebase dynamic link but, unable to fetch custom parameters.

Any help will be appreciated.

Updated Code :

For sending invite :

_generateAndShareDynamicLink() async {
    final DynamicLinkParameters parameters = DynamicLinkParameters(
      uriPrefix: 'https://test.page.link/groupinvite',
      link: Uri.parse('https://test.page.link/groupinvite'),
      androidParameters: AndroidParameters(
        packageName: 'com.test.flutter_authentication',
        minimumVersion: 0,
      ),
      dynamicLinkParametersOptions: DynamicLinkParametersOptions(
        shortDynamicLinkPathLength: ShortDynamicLinkPathLength.unguessable,
      ),
    );

    Uri url = await parameters.buildUrl();

    shareURL(Uri.https(url.authority, url.path, {"username": "Test"}));
}

For fetching data inside initState() :

FirebaseDynamicLinks.instance.onLink(
        onSuccess: (PendingDynamicLinkData dynamicLink) async {
          final Uri deepLink = dynamicLink?.link;
          _scaffoldKey.currentState.showSnackBar(SnackBar(content: Text("deepLink2 : ${deepLink}",)));
          if (deepLink != null) {
            Map sharedListId = deepLink.queryParameters;
            print("sharedListId : ${sharedListId}");

            String username=sharedListId["username"];
            print("username : ${username}");

            Navigator.pushNamed(context, deepLink.path);
          }
        }, onError: (OnLinkErrorException e) async {
      print('onLinkError');
      print(e.message);
    });

Still retrieved data is null.

Can anybody help ?

Mahesh P
  • 400
  • 1
  • 4
  • 18

2 Answers2

41

The best way to use dynamic links are,

import 'package:firebase_dynamic_links/firebase_dynamic_links.dart';
import 'package:flutter/material.dart';

class TestPage extends StatefulWidget {
  @override
  _TestPageState createState() => _TestPageState();
}

class _TestPageState extends State<TestPage> {

  @override
  void initState() {
    super.initState();
    fetchLinkData();
  }

  void fetchLinkData() async {
    // FirebaseDynamicLinks.getInitialLInk does a call to firebase to get us the real link because we have shortened it.
    var link = await FirebaseDynamicLinks.instance.getInitialLink();

    // This link may exist if the app was opened fresh so we'll want to handle it the same way onLink will.
    handleLinkData(link);

    // This will handle incoming links if the application is already opened
    FirebaseDynamicLinks.instance.onLink(onSuccess: (PendingDynamicLinkData dynamicLink) async {
      handleLinkData(dynamicLink);
    });
  }

  void handleLinkData(PendingDynamicLinkData data) {
    final Uri uri = data?.link;
    if(uri != null) {
      final queryParams = uri.queryParameters;
      if(queryParams.length > 0) {
        String userName = queryParams["username"];
        // verify the username is parsed correctly
        print("My users username is: $userName");
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Sample"),
      ),
      body: Center(
        child: Text("Test"),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          var dynamicLink = await createDynamicLink(userName: "Test");
          // dynamicLink has been generated. share it with others to use it accordingly.
          print("Dynamic Link: $dynamicLink");
        },
        child: Icon(
          Icons.add,
          color: Colors.white,
        ),
      ),
    );
  }

  Future<Uri> createDynamicLink({@required String userName}) async {
    final DynamicLinkParameters parameters = DynamicLinkParameters(
      // This should match firebase but without the username query param
      uriPrefix: 'https://test.page.link',
      // This can be whatever you want for the uri, https://yourapp.com/groupinvite?username=$userName
      link: Uri.parse('https://test.page.link/groupinvite?username=$userName'),
      androidParameters: AndroidParameters(
        packageName: 'com.test.demo',
        minimumVersion: 1,
      ),
      iosParameters: IosParameters(
        bundleId: 'com.test.demo',
        minimumVersion: '1',
        appStoreId: '',
      ),
    );
    final link = await parameters.buildUrl();
    final ShortDynamicLink shortenedLink = await DynamicLinkParameters.shortenUrl(
      link,
      DynamicLinkParametersOptions(shortDynamicLinkPathLength: ShortDynamicLinkPathLength.unguessable),
    );
    return shortenedLink.shortUrl;
  }
}

You're done.

Jay Mungara
  • 6,663
  • 2
  • 27
  • 49
  • 1
    I have created link using the same way. But the link generated says that the dynamic link not found when opened on browser. And the link created here doesn't shows in the firebase console also. – Vipin Malik May 09 '20 at 12:55
  • 1
    Hats off sir. Been searching for adding parameters to the link and haven't been satisfied. This helps me a lot. Thank you – Lallawmzuala khawlhring Jul 15 '20 at 09:12
  • 3
    URI is working fine during redirect in web browser parameters showing inside URL but I am not getting queryParameters. – Jaydeep Patel Aug 26 '20 at 11:51
  • Thanks a lot Jay! I was literally banging my head to understand dynamic links, but I have a working proof of concept now ! – abhijat_saxena Sep 06 '20 at 17:10
  • 1
    @abhijat_saxena I'm glad i could help. At first, i also had the same feeling when there were no answers for my requirements. – Jay Mungara Sep 07 '20 at 05:57
  • @JayMungara, I tried out the answer and noticed some issues and hope you can advise here. When the app is in the background (already previously launched), the "handleLinkData" is called twice. Once through "FirebaseDynamicLinks.instance.onLink" and another through the main handleLinkData(link); – Calvin Dec 28 '20 at 02:47
  • Can you please tell how the link looks in the firebase console –  Jan 11 '21 at 20:19
  • Please can u share what link you created on the firebase console –  Jan 15 '21 at 08:58
  • @Lucian "https://developer.page.link" is the link I have generated in my firebase console. – Jay Mungara Jan 16 '21 at 11:45
  • 1
    adding comment to help me find this solution in future. Thanks Jay – Mrudul Addipalli Jul 24 '21 at 23:15
  • Has anybody seen these query parameters passed when installing the app via dynamic link and then opening the app? We can only see these parameters if the app is already installed. – Sean Aug 18 '21 at 20:18
6

This worked for me

The sending side:

Future<String> generateLink() async {
final DynamicLinkParameters parameters = DynamicLinkParameters(
      uriPrefix: 'https://<your-domain-name>.page.link',
      link: Uri.parse(
          'https://<your-domain-name>.page.link/<your-route>/?id=acb&name=me'), // <- your paramaters
      dynamicLinkParametersOptions: DynamicLinkParametersOptions(
          shortDynamicLinkPathLength: ShortDynamicLinkPathLength.unguessable),
      androidParameters: AndroidParameters(
        packageName: '<package-name>',
        minimumVersion: 0,
      ),
      socialMetaTagParameters: SocialMetaTagParameters(
        title: "click the link",
      ),
    );
    final Uri dynamicUrl = await parameters.buildUrl();
    final ShortDynamicLink shortenedLink =
        await DynamicLinkParameters.shortenUrl(
      dynamicUrl,
      DynamicLinkParametersOptions(
          shortDynamicLinkPathLength: ShortDynamicLinkPathLength.unguessable),
    );
    final Uri shortUrl = shortenedLink.shortUrl;
    return "https://<your-domain-name>.page.link" + shortUrl.path;
  }

The receiving side:

FirebaseDynamicLinks.instance.onLink(
    onSuccess: (PendingDynamicLinkData dynamicLink) async {
      final Uri deepLink = dynamicLink?.link;
      if (deepLink != null) {
        print(deepLink.queryParameters['id']); // <- prints 'abc'
      }
    }, onError: (OnLinkErrorException e) async {
    print('onLinkError');
    print(e.message);
  }
);
Zvi Karp
  • 3,621
  • 3
  • 25
  • 40