Flutter Deeplink如何传递参数并实现带参页面路由?
Flutter DeepLink动态参数路由实现方案
问题根源
静态路由(如/signup)正常跳转,但/course/:courseId这类带参数的动态路由失效,核心原因是未解析DeepLink路径中的参数,也未实现带参数的路由导航逻辑——当前_handleLink方法仅打印链接,未处理动态路由场景。
解决方案
1. 重构DeepLink处理逻辑
修改_handleLink方法,解析Uri路径片段,提取参数并完成带参导航:
static void _handleLink(String? link, BuildContext context) { if (link == null) return; final Uri deepLink = Uri.parse(link); final pathSegments = deepLink.pathSegments; print('DeepLink received: $deepLink'); // 处理单段静态路由 if (pathSegments.length == 1) { switch (pathSegments.first) { case 'signup': Navigator.pushNamed(context, '/signup'); break; // 可添加其他静态路由分支 } } // 处理带参数的动态路由(如/course/123) else if (pathSegments.length == 2 && pathSegments[0] == 'course') { final courseId = pathSegments[1]; // 向课程页传递参数 Navigator.pushNamed( context, '/course', arguments: {'courseId': courseId}, ); } // 可扩展更多动态路由规则,如多层嵌套路径 }
2. 配置路由表支持参数接收
在MaterialApp的路由表中,确保课程页能正确获取传递的参数:
MaterialApp( initialRoute: '/', routes: { '/signup': (_) => const SignupPage(), '/course': (context) { // 提取路由参数 final args = ModalRoute.of(context)?.settings.arguments as Map<String, dynamic>?; return CoursePage(courseId: args?['courseId'] ?? ''); }, }, );
3. 验证Android配置(无需修改,仅确认)
你的Android Intent Filter已正确配置,<data>标签覆盖了http/https scheme和domain.com host,默认会匹配所有子路径,无需额外添加pathPattern。
测试方法
用adb命令直接触发动态DeepLink测试:
adb shell am start -W -a android.intent.action.VIEW -d "https://domain.com/course/456" com.your.app.package
内容的提问来源于stack exchange,提问作者Douo
相关产品推荐
相关产品推荐

