Created
May 7, 2022 08:33
-
-
Save Jay-flow/0355b7b920d15b74eae8b872ce4ea94e to your computer and use it in GitHub Desktop.
Implement dynamic links in the Flutter
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'package:artcalendar/models/enums.dart'; | |
import 'package:artcalendar/screens/artist_screen.dart'; | |
import 'package:artcalendar/screens/exhibition_detail_screen.dart'; | |
import 'package:artcalendar/screens/exhibitor_screen.dart'; | |
import 'package:firebase_dynamic_links/firebase_dynamic_links.dart'; | |
import 'package:get/get.dart'; | |
import 'package:uni_links/uni_links.dart'; | |
import 'constants.dart'; | |
import 'logger.dart'; | |
class DynamicLink { | |
Future<bool> setup() async { | |
bool isExistDynamicLink = await _getInitialDynamicLink(); | |
_addListener(); | |
return isExistDynamicLink; | |
} | |
Future<bool> _getInitialDynamicLink() async { | |
final String? deepLink = await getInitialLink(); | |
if (deepLink != null) { | |
PendingDynamicLinkData? dynamicLinkData = await FirebaseDynamicLinks | |
.instance | |
.getDynamicLink(Uri.parse(deepLink)); | |
if (dynamicLinkData != null) { | |
_redirectScreen(dynamicLinkData); | |
return true; | |
} | |
} | |
return false; | |
} | |
void _addListener() { | |
FirebaseDynamicLinks.instance.onLink.listen(( | |
PendingDynamicLinkData dynamicLinkData, | |
) { | |
_redirectScreen(dynamicLinkData); | |
}).onError((error) { | |
logger.e(error); | |
}); | |
} | |
void _redirectScreen(PendingDynamicLinkData dynamicLinkData) { | |
if (dynamicLinkData.link.queryParameters.containsKey('id')) { | |
String link = dynamicLinkData.link.path.split('/').last; | |
String id = dynamicLinkData.link.queryParameters['id']!; | |
switch (link) { | |
case exhibition: | |
Get.offAll( | |
() => ExhibitionDetailScreen( | |
mainBottomTabIndex: MainBottomTabScreenType.exhibitionMap.index, | |
), | |
arguments: { | |
"exhibitionId": id, | |
}, | |
); | |
break; | |
case artist: | |
Get.offAll( | |
() => ArtistScreen(), | |
arguments: { | |
"artistId": id, | |
}, | |
); | |
break; | |
case exhibitor: | |
Get.offAll( | |
() => ExhibitorScreen(), | |
arguments: { | |
"exhibitorId": id, | |
}, | |
); | |
break; | |
} | |
} | |
} | |
Future<String> getShortLink(String screenName, String id) async { | |
final dynamicLinkParams = DynamicLinkParameters( | |
uriPrefix: dynamicLinkPrefix, | |
link: Uri.parse('$dynamicLinkPrefix/$screenName?id=$id'), | |
androidParameters: const AndroidParameters( | |
packageName: packageName, | |
minimumVersion: 0, | |
), | |
iosParameters: const IOSParameters( | |
bundleId: packageName, | |
minimumVersion: '0', | |
), | |
); | |
final dynamicLink = | |
await FirebaseDynamicLinks.instance.buildShortLink(dynamicLinkParams); | |
return dynamicLink.shortUrl.toString(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment