Flutter Deep Linking配置后跨应用唤起与参数传递问题咨询
问题1:不使用adb从其他应用唤起当前Flutter应用的方法
分不同场景实现:
- 安卓原生应用唤起:直接构造匹配规则的Intent启动即可,示例代码如下:
// Kotlin 示例 val intent = Intent(Intent.ACTION_VIEW, Uri.parse("appName://com.companyName.appName/help")) intent.addCategory(Intent.CATEGORY_BROWSABLE) // 可选:添加判断避免找不到应用崩溃 if (intent.resolveActivity(packageManager) != null) { startActivity(intent) }
- 网页端唤起:直接在HTML中用a标签指向你的Deep Link地址即可:
<a href="appName://com.companyName.appName/help">打开指定应用</a>
注意部分浏览器会拦截非http/https的scheme跳转,需要用户手动确认触发。
- 其他Flutter应用唤起:使用
url_launcher库直接调用对应地址即可,示例代码:
import 'package:url_launcher/url_launcher.dart'; final Uri targetUri = Uri.parse('appName://com.companyName.appName/help'); if (await canLaunchUrl(targetUri)) { await launchUrl(targetUri); }
问题2:Deep Linking唤起时传递参数的方法
参数添加方式
直接按照URI的标准规则在路径后拼接Query参数即可,示例地址:
appName://com.companyName.appName/help?id=123&keyword=test&from=web
你可以直接用adb测试参数传递是否正常,对应adb命令如下:
adb shell am start -W -a android.intent.action.VIEW -c android.intent.category.BROWSABLE -d "appName://com.companyName.appName/help?id=123&keyword=test"
参数获取方式
在Flutter层可以直接通过路由监听拿到完整的Uri,再解析参数即可:
- 如果你使用GoRouter等路由框架,可直接在路由配置中获取参数:
GoRoute( path: '/help', builder: (context, state) { // 直接读取参数 final id = state.uri.queryParameters['id']; final keyword = state.uri.queryParameters['keyword']; return HelpPage(id: id, keyword: keyword); }, )
- 如果你使用原生路由,可通过
WidgetsBindingObserver监听路由变化获取初始Uri和后续唤起的Uri:
@override void initState() { super.initState(); WidgetsBinding.instance.addObserver(this); // 获取首次启动的Deep Link参数 _getInitialUri(); } Future<void> _getInitialUri() async { final routeStr = WidgetsBinding.instance.platformDispatcher.defaultRouteName; final uri = Uri.parse(routeStr); // 解析uri即可拿到所有参数 } @override void didChangeAppLifecycleState(AppLifecycleState state) { if (state == AppLifecycleState.resumed) { // 应用从后台唤起时重新获取Uri _getInitialUri(); } }
内容的提问来源于stack exchange,提问作者derChris
相关产品推荐
相关产品推荐

