Flutter:如何配置仅通过含Fragment的链接唤起应用?
解决Android深度链接过滤Fragment的问题
嘿,我懂你的困扰——本来只想让带#/app fragment的链接唤起应用,结果现在只要是https://*.name的链接都能触发,完全没达到预期。这其实是因为你对AndroidManifest里的android:fragment属性理解错啦,它根本不是用来过滤URL中#后面的fragment部分的!
问题根源
Android的<intent-filter>里的<data>标签的android:fragment属性,作用是指定启动Activity时要加载的Fragment实例,和URL里#后的内容没有半毛钱关系。所以你之前的配置相当于没做任何fragment过滤,只要是符合scheme和host的链接,都会触发这个intent-filter唤起应用。
正确的解决方案
我们换个思路:先让所有符合https://*.name的链接都能唤起应用,再在代码层面判断链接是否包含目标fragment,决定是否执行对应唤起逻辑。
1. 修正AndroidManifest配置
删掉<data>标签里的android:fragment="/app",修改后的配置如下:
<intent-filter android:autoVerify="true"> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:scheme="https" android:host="*.name" /> </intent-filter>
2. 在代码中过滤Fragment
用uni_links拿到完整链接后,判断是否包含#/app,只有符合条件的才处理唤起逻辑:
import 'package:uni_links/uni_links.dart'; import 'package:flutter/services.dart'; // 初始化深度链接监听 Future<void> initDeepLinkListener() async { try { // 处理应用冷启动时的初始链接 final initialLink = await getInitialLink(); if (initialLink != null) { _processDeepLink(initialLink); } // 处理应用运行时的链接 linkStream.listen((String? link) { if (link != null) { _processDeepLink(link); } }, onError: (error) { // 添加错误处理逻辑 }); } on PlatformException catch (e) { print('深度链接初始化失败: ${e.message}'); } } // 处理深度链接逻辑 void _processDeepLink(String link) { // 检查链接是否包含目标fragment if (link.contains('#/app')) { // 执行唤起对应页面的逻辑 print('加载带/app fragment的页面'); // 示例:Navigator.pushNamed(context, '/target-page'); } else { // 不符合条件的链接,可选择引导到首页或不处理 print('非目标链接,不执行特定唤起逻辑'); // 示例:Navigator.pushNamed(context, '/home'); } }
这样设置后,只有带有#/app的链接才会触发你想要的唤起逻辑,其他同域名链接即便能唤起应用,也会被引导到合适的页面,不会干扰你的预期流程。
内容的提问来源于stack exchange,提问作者Little Monkey
相关产品推荐
相关产品推荐

