Đây là service mình dùng để handle deeplink data:
class DeepLinkServices extends GetxController { DeepLinkServices._privateConstructor(); static final DeepLinkServices _instance = DeepLinkServices._privateConstructor(); static DeepLinkServices get instance => _instance; Uri? get initialLink => _initialLink; Uri? _initialLink; StreamSubscription<Uri>? _linkSubscription; bool _isInitialAppLinkHandled = false; @override void onInit() { super.onInit(); initialize(); } Future<void> initRoute() async { final appLinks = AppLinks(); _initialLink = await appLinks.getInitialLink(); } Future<void> initialize() async { final appLinks = AppLinks(); Logger.i('[Deep Link]: initialize'); // Check initial link if app was in cold state (terminated) if (!_isInitialAppLinkHandled) { _initialLink = await appLinks.getInitialLink(); if (_initialLink != null) { _isInitialAppLinkHandled = true; _handleLinkData(_initialLink!); } } // Handle link when app is in warm state (foreground or background) _linkSubscription = appLinks.uriLinkStream.listen( _handleLinkData, onError: (err) { Logger.e('[Deep Link]: Fail $err'); }, onDone: () { _linkSubscription?.cancel(); }, ); } @override void onClose() { _linkSubscription?.cancel(); super.onClose(); } /// Handles the link navigation Deep Links. void _handleLinkData(Uri uri) { Logger.i('[Deep Link] Handler: $uri'); // Parse the URI and navigate based on path final parsedPath = _parsePath(uri); if (parsedPath != null) { _handleNavigation(parsedPath); } } /// Parses the URI path to determine the type and ID Map<String, String>? _parsePath(Uri uri) { if (uri.pathSegments.isNotEmpty) { if (uri.pathSegments[0] == 'product') { return { 'type': 'product', 'id': uri.pathSegments.last, }; } else if (uri.pathSegments[0] == 'user') { return { 'type': 'user', 'id': uri.pathSegments.last, }; } } return null; } /// Navigate based on parsed path void _handleNavigation(Map<String, String> parsedPath) { final type = parsedPath['type']; final id = parsedPath['id']; Logger.e('[Deep Link] type: $type = id: $id'); if (type == 'product' && id != null) { navigatorKey.currentState?.context.navigateTo( RoutePath.requestProductScreen, routeSettings: RouteSettings( arguments: ProductInviteArgument(int.parse(id)), ) ); } else if (type == 'user' && id != null) { // Navigate to user screen final userModel = UserModel(userId: int.tryParse(id)); navigatorKey.currentState?.context.navigateTo( RoutePath.userDetailScreen, routeSettings: RouteSettings( arguments: UserDetailArgument(userModel), ), ); } else { Logger.e('[Deep Link] Unknown path: $type'); } }
}
Ngoài file main.dart, init service này lên :
await DeepLinkServices.instance.initRoute();
Vậy là xong, để điều hướng đi chỗ khác thì bn chỉnh lại code trong service đến trang mình cần.